C 中参数求值顺序的编译器优化
C 标准允许编译器自行选择函数参数的求值顺序。这就提出了一个问题:现实世界的实现是否利用这种模糊性来提高性能。
在大多数情况下,编译器不会优化参数求值顺序。然而,体系结构、调用约定和参数类型会影响行为。在 x86 计算机上,Pascal 调用约定从左到右计算参数,而 C 约定 (__cdecl) 从右到左计算参数。与平台无关的程序通常会考虑调用约定以避免意外。
例如,在经典的代码片段中:
int i = 0; foo(i++, i++);
在 Pascal 调用约定中,编译器可能会在 i 之前计算 i,但是相反的情况可能发生在 __cdecl 中。尽管如此,结果是未定义的,并且不鼓励依赖特定的评估顺序。
请注意,语言标准将参数评估顺序分类为“未指定”,这意味着它没有明确定义或不允许。这允许依赖于实现的行为并强调抽象机的不确定性。
以上是C 编译器优化是否利用参数求值顺序歧义?的详细内容。更多信息请关注PHP中文网其他相关文章!