【发布时间】:2019-02-11 10:13:12
【问题描述】:
我很难理解为什么我的编译器(g++ 8.1.0 和 clang++ 6.0.0)对待 POD(plain-old-data)和非 POD 代码的方式不同。
测试代码:
#include <iostream>
struct slong {
int i;
~slong() { i = 0; }
};
int get1(slong x) { return 1+x.i; }
int main() {
std::cerr << "is_pod(slong) = " << std::is_pod<slong>::value << std::endl;
}
使用析构函数(因此不是 POD)定义一个类 slong,并且带有 -Ofast 的编译器将为 get1 生成
movl (%rdi), %eax
incl %eax
但是当我注释掉析构函数时(所以slong 变成了 POD)我得到了
leal 1(%rdi), %eax
当然,性能问题是次要的;我还是想明白。在其他(更复杂的)情况下,我还注意到更显着的代码差异。
【问题讨论】:
-
请注意,析构函数中的操作是没有意义的。
int即将不复存在,谁在乎它的价值是什么?
标签: c++ compiler-optimization register-allocation