コードの 2 つの部分が sizeof() 演算子に対して異なる結果を返すという C++ の問題をトラブルシューティングしようとしています。
これが私が実行するものです
MyClass* foo = new MyClass();
int size = sizeof(*foo)
このコードをプロジェクトの 2 つの異なるセクションに配置すると、2 つの異なる結果が得られます。ある時は 2254 で、別の時は 2284 です。メモリ レイアウトを見ると、ある領域では内部メンバがバイト アラインされ、別の領域ではワード アラインされています。
逆アセンブリを見ると、sizeof() の値が実際にはマシン コードの一部であることがわかります。これはコンパイラまたはリンカのバグでしょうか? 同じプロジェクトの 2 つの部分が同じクラスを異なって表示するのはなぜですか?
編集:
これが ODR 違反ではないことを示すために実行した、より明確な例を示しましょう。
私はちょうどそのような真新しいクラスを作りました
class TestAlignClass
{
public:
TestAlignClass() { }
~TestAlignClass() { }
private:
char charArray[3];
int myInt;
};
クラスが 4 に揃えられている場合、sizeof() = 8 を返す必要があります。これは私が望むものです。しかし、私のコードには sizeof() = 7 を返す特定のクラスがあります。
実際、new() 演算子に足を踏み入れると、7 バイトが割り当てられることもあれば、8 バイトが割り当てられることもあります。
複数のプロジェクトをリンクしていますが、最初はプロジェクトの設定に関係があると思っていましたが、同じプロジェクトのさまざまな部分で不一致が見られます。