【发布时间】:2021-10-19 10:36:38
【问题描述】:
我们最近发现编译器(对我们来说是 GCC)可以结合开发人员设置的断言优化一些代码。
此代码示例:
#include <cassert>
int getBatteryLevel(){
return 0;
}
int process(int level);
int main() {
[[maybe_unused]] const auto level = getBatteryLevel();
assert(level > 0);
process(level);
}
即使process 没有实现,也会与-O2 链接。没有优化就不会链接。
这是否记录在任何地方?
【问题讨论】:
-
不确定这是否在任何地方明确记录。只是编译器注意到没有办法调用
process。请注意,当您将断言替换为if (level == 0) std::terminate();时,您会得到相同的效果。 godbolt.org/z/sW6sod7jb 所以这不是特定于assert -
这是一个有趣的观察,但恐怕答案(几乎?)微不足道:链接器仅在实际调用函数时才抱怨缺少定义。当没有打开优化时,编译器不会费心删除死代码
-
我相信这应该回答为什么允许这样做:stackoverflow.com/questions/15718262/…
-
您的示例现在完全不同了,但编译器仍然可以看到程序在调用函数之前终止。
-
fwiw,同样在您的新示例中,您可以将
assert替换为对terminate的等效调用以查看相同的效果:godbolt.org/z/v5aEq6M4Y
标签: c++ gcc optimization compiler-construction assert