[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
2022-03-23 15:52:38
疑問点
なぜ
sizeof
演算子は、構造体に対して、その構造体のメンバの合計サイズよりも大きなサイズを返すのですか?
どのように解決するのですか?
これは、アライメント制約を満たすためにパディングを追加しているためです。 データ構造のアライメント は、プログラムの性能と正しさの両方に影響を与えます。
-
不整列なアクセスはハードエラーになる可能性があります(多くの場合
SIGBUS
). -
不整列なアクセスはソフトエラーの可能性があります。
- ハードウェアで修正するか、適度な性能劣化のため。
- または、ソフトウェアでエミュレートして修正し、性能劣化を激しくする。
- また、アトミック性などの同時並行性の保証が破られ、微妙な誤差が生じる可能性があります。
以下は、x86プロセッサの典型的な設定を使用した例です(すべて32ビットと64ビットモードを使用)。
struct X
{
short s; /* 2 bytes */
/* 2 padding bytes */
int i; /* 4 bytes */
char c; /* 1 byte */
/* 3 padding bytes */
};
struct Y
{
int i; /* 4 bytes */
char c; /* 1 byte */
/* 1 padding byte */
short s; /* 2 bytes */
};
struct Z
{
int i; /* 4 bytes */
short s; /* 2 bytes */
char c; /* 1 byte */
/* 1 padding byte */
};
const int sizeX = sizeof(struct X); /* = 12 */
const int sizeY = sizeof(struct Y); /* = 8 */
const int sizeZ = sizeof(struct Z); /* = 8 */
構造体のサイズを小さくするには,メンバをアライメントでソートすればよい(基本型ではサイズによるソートで十分)(例えば構造体
Z
の例)。
重要な注意:CとC++の両標準は、構造のアライメントは実装によって決定されると述べています。 したがって、各コンパイラが異なるデータ配置を選択する可能性があり、その結果、異なる互換性のないデータレイアウトが発生します。 このため、異なるコンパイラで使用されるライブラリを扱う場合、コンパイラがどのようにデータを整列させるかを理解することが重要です。 コンパイラによっては、コマンドラインでの設定や特別な
#pragma
ステートメントを使用して、構造のアライメント設定を変更することができます。
関連
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 0.1fを0にすると、なぜ10倍もパフォーマンスが落ちるのですか?
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】変数やフィールドがvoid宣言されている