1

次の C++ クラスを検討してください。

class MyClass
{
    TypeA a;
    TypeB b;
    TypeC c;
};

私が使用するコンパイラは、メモリ内のメンバーの順序がクラス定義で使用した順序と同じになるように、このクラスの表現を作成します。私は最近、この事実を悪用してメンバーを初期化するプログラムに遭遇しました。レイアウトはコンパイラに依存するため、これが非常に悪い考えであることはわかっていますが、コードを書いていないので、これまでのところうまくいきました。

ASLR現代のオペレーティングシステムの機能がこれを台無しにするのではないかと思っていました。オブジェクトが で動的にインスタンス化されている場合、これは当てはまらないと確信していますheap。しかし、他の場合はどうでしょうか。

4

1 に答える 1

3

いいえ...メモリレイアウトの順序は標準によって保証されていますが、メンバー間にもパディングが含まれる可能性があります(常にsizeof結果に含まれますが、それはあなたが説明したようなハッキーコードが明示的なプラグマを使用したい場合があることを意味します)データメンバーをパックするか、offsetof を使用して操作するオフセットの範囲を計算します。そうしないと、レイアウトが異なる他のコンパイラ/コンパイラ設定で壊れる可能性があります。

それとは別に、オブジェクトのレイアウトは、それらのオブジェクトが作成される場所に関係なく同じです: グローバル、スタック、ヒープ - それは常に同じです。考慮してください-offsetofはコンパイル時定数です。

于 2013-05-09T05:51:11.677 に答える