3

sizeof (int)sizeof(double)がそれぞれ 4 と 8 であり、次のコードの前に#pragma packなどのプリプロセッサ コマンドまたはコンパイラ コマンド ラインで使用される#pragma packと同じ機能を持つコンパイラ オプションがないものとします。

typedef struct
{
    int n;
    double d;
} T;

sizeof(T)はいくらですか?

CPUとRAM間のデータバス幅にもよると思います。幅が 32 ビットの場合、sizeof(T) は 12 です。幅が 64 ビットの場合、sizeof(T) は 16 です。32 ビットのデータ バスを備えたコンピューターで、64 ビットの数値を CPU から RAM に転送するにはまたはその逆の場合、CPU はデータ バスに 2 回アクセスし、一度に 32 ビットの読み取りまたは書き込みを行う必要があるため、構造体Tのメンバーdを 8 の倍数のアドレスに格納しても意味がありません。

同意しますか?

(下手な英語でごめんなさい)

4

1 に答える 1

4

では、いくらsizeof(T)ですか?

おっしゃるとおり、これはシステム、コンパイラ、および最適化設定に大きく依存します。double一般的に言えば、構造体の 8 バイト メンバにどのアラインメントを選択するかは、少なくとも理論上はコンパイラが最もよく知っています。さらに、コンパイラーの決定は、最速の速度を最適化するように依頼する場合と比較して、メモリーフットプリントを小さくするように最適化するように依頼する場合とで異なる場合があります。

最後に、8 バイト境界ではなく 4 バイト境界に位置合わせされたアドレスから 8 バイトを読み取っても、ペナルティがまったくないシステムが存在する可能性があります。繰り返しますが、コンパイラはその事実を知るのに最適な立場にあり、struct不必要にパディングを避けることができます。

アライメントについて覚えておくべき最も重要なことはstruct、製品を別のプラットフォームに移植するつもりがなくても、特定のレイアウトを想定してはならないということです。makefile に最適化フラグを追加するだけの単純な変更でも、あなたの仮定を無効にするのに十分です。

于 2013-09-26T14:05:04.787 に答える