4

コードの 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 バイトが割り当てられることもあります。

複数のプロジェクトをリンクしていますが、最初はプロジェクトの設定に関係があると思っていましたが、同じプロジェクトのさまざまな部分で不一致が見られます。

4

1 に答える 1

8

sizeofコンパイル時に評価されます。

2 つの異なる場所で同じコンストラクトに対して異なる値を返す理由についてsizeofは、異なる翻訳単位で何らかの方法でクラスを定義する必要があります。

私が最初に見たいのはパッキンです。ある#pragma pack (1)TU に型式があり、別の TU にない場合、それが原因である可能性があります。これは、One Definition Rule の違反を示している可能性もありますが、それは別の話です。

もう 1 つの、おそらくより風変わりなもの#ifdefは、クラスの一部に影響を与える型マクロの存在です。

@MooingDuck がコメントで正しく観察しているように、バグがコードにある可能性が非常に高いです。コンパイラに欠陥があると想定しないでください。

于 2013-06-28T19:45:47.137 に答える