私のコンパイラ (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
しかし、デストラクタをコメントアウトすると(slongPODになります)、
leal 1(%rdi), %eax
もちろん、パフォーマンスの問題は軽微です。それでも理解したい。他の (より複雑な) ケースでは、より重要なコードの違いにも気付きました。