3

私のコンパイラ (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

もちろん、パフォーマンスの問題は軽微です。それでも理解したい。他の (より複雑な) ケースでは、より重要なコードの違いにも気付きました。

4

1 に答える 1