![]() |
1
1
该标准保证
编译器可以删除没有副作用的代码,但仅通过检查函数签名无法明确确定这些代码。对于内联函数,编译器可以看到代码,编译器有机会。对于在不同的翻译单元中定义的函数,事情有点困难(通过链接时间优化,如果函数是 足够小 ). 请注意,这不仅限于通过值或常量引用获取参数的函数。如果编译器看到一个函数 修改 争论 通过引用 ,但它可以证明修改后的对象的值再也不会被读取,理论上它可以删除调用。另一方面,除了简单的情况外,我不会打赌编译器会这样做。 |
|
2
0
我认为这属于“定义明确的未定义行为”的范畴;它会的 可能 一直在工作(假设sizeof(int*)==sizeof(int)),但它在技术上是未定义的,将来有可能被某些编译器完全破坏。另一个例子是使用并集将float的位重新解释为int。 此外,如果我没有为您指明LLVM的链接时间优化方向,那我就大错特错了。它的目标是在链接时准确地完成您正在谈论的内容。它很棒,在osx上“开箱即用”。他们还有一个很好的、简单的例子来说明它是如何工作的: http://llvm.org/docs/LinkTimeOptimization.html |
![]() |
apetrai · 我应该如何假设算法使用哪种迭代器类别? 2 年前 |
![]() |
ridiculous_fish · std::是否保证短路? 2 年前 |
![]() |
Fabio · 在c中将指针赋给常数指针++ 2 年前 |
![]() |
johnco3 · 初始化固定C数组成员结构 7 年前 |
![]() |
mans · 为什么出现此错误:constexpr在此处无效 7 年前 |
![]() |
juztcode · 在C++中尝试捕获-创建了多少个对象 7 年前 |
![]() |
Steven Scott · 忽略元素的基于范围的for循环 7 年前 |