【发布时间】:2021-01-18 12:14:25
【问题描述】:
假设我的代码有以下功能:
inline int foo() {
bar();
int y = baz();
return y;
}
并假设bar() 和baz() 有副作用。
如果我写:
int z = foo();
printf("z is %d\n", z);
那么显然bar() 和baz() 都必须被执行。但如果我写:
foo();
并且不使用返回值,调用baz() 的唯一原因是它的副作用。
有没有一种方法可以告诉我的编译器(对于任何一个:GCC、clang、MSVC、Intel),例如“您可能会忽略 baz() 的副作用以决定是否优化它”?或者“你可以忽略这条指令的副作用来决定是否优化它”?
这个问题适用于 C 和 C++,但可能与各种程序语言相关。让我们把它改成 C++,因为这是我现在用得最多的。
注意:
-
bar()、baz()不在我的控制范围内。 -
foo()的签名不得更改。当然,如果我愿意,我可以使用一些代理并懒惰地申请baz();或者只是为不使用y的情况编写一个不同的函数。这不是我要问的。
【问题讨论】:
-
您可以将可选的输出参数传递给函数,并且仅在不是
NULL时才调用baz。它当然不如int z = foo();好,但可以做到这一点。 -
大概
foo必须是一个内联函数,或者你有一些非常激进的 lto,否则单独的编译模型模型使得编译器不太可能假设调用者如何使用返回值。 -
@NateEldredge:链接到有关“纯”或“常量”作为属性的信息?另外,如果
bar()和baz()不受我控制并且来自some_lib.h怎么办? -
@StoryTeller-UnslanderMonica:将
foo()内联,否则问题可能只是关于翻译单元内的优化。 -
@Bathsheba:这可能会改变副作用的时间,包括它们的相对时间。另外,问题底部的注释也是如此。
标签: c++ compiler-optimization side-effects compiler-options elision