gpt4 book ai didi

c++ - 如果无限循环调用共享库,它在 C++ 中是否仍然是未定义的行为?

转载 作者:可可西里 更新时间:2023-11-01 15:23:56 25 4
gpt4 key购买 nike

据说无限循环for(;;);是未定义的行为。


来自 http://en.cppreference.com/w/cpp/language/memory_model

In a valid C++ program, every thread eventually does one of the following:

  • terminate
  • makes a call to an I/O library function
  • reads or modifies a volatile object
  • performs an atomic operation or a synchronization operation

No thread of execution can execute forever without performing any of these observable behaviors.

Note that it means that a program with endless recursion or endless loop (whether implemented as a for-statement or by looping goto or otherwise) has undefined behavior.


但是如果它调用共享库中的函数怎么办?

for(;;) sofunc();

该函数可以执行任何类型的阻塞 I/O,或抛出异常。

在这种情况下,编译器是否假定循环具有某些可观察到的行为?

最佳答案

在许多地方,标准的语言赋予编译器超出有用优化所需的自由,但它反而会为编译器提供将最小惊讶原则抛在脑后的方法。关于无限循环的规则的编写方式适合该类别。

关于无限循环的规则将促进的大多数优化将由语言启用,该语言指定执行一段代码所需的时间,即使无限,也不被认为是是编译器需要保留的副作用。这样的规则将允许编译器忽略任何没有任何直接副作用的循环迭代,并且不修改在别处使用的值。

然而,标准不止于此。给定代码:

int foo(void)
{
int x=0;
do
{
x=functionWithNoSideEffects(x);
} while(x != 23 && x != 42);
return x;
}

可以显示 functionWithNoSideEffects 的编译器永远不会任何定义的副作用并且永远不会返回 23 可以用“return 42;”替换“foo”的代码。即使该程序的目的是测试 functionWithNoSideEffects 是否会返回 42(在这种情况下,无论函数是否返回 42,生成的代码都将无济于事),标准也不会要求编译器生成代码来实际测试,除非该循环包含某种“副作用”。

我个人不相信制定这样的规则的值(value)如果编译器可以证明如果 X 不为真则循环无法终止,那么它们可能会认为 X 为真,无论是否有任何方法可以证明它可能。然而,基于该原则的优化似乎很受欢迎。

关于c++ - 如果无限循环调用共享库,它在 C++ 中是否仍然是未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41320725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com