[解決済み] C言語による構造体メモリレイアウト
質問
私はC#のバックグラウンドを持っています。Cのような低レベルの言語にはとても初心者です。
C#では
struct
のメモリは、デフォルトでコンパイラによってレイアウトされます。コンパイラはデータ フィールドを並べ替えたり、フィールド間に追加のビットを暗黙のうちに埋め込むことができます。そのため、正確なレイアウトのために、この動作を上書きする特別な属性を指定する必要がありました。
のメモリレイアウトを並べ替えたり整列させたりすることはありません。
struct
のメモリレイアウトを変更したり整列させたりしません。しかし、ちょっとした例外があるそうで、それを見つけるのは非常に難しいそうです。
C言語のメモリレイアウトの動作はどうなっているのでしょうか?何が再注文/整列されるべきで、何がされないのでしょうか?
どのように解決するのですか?
C言語では、コンパイラはすべてのプリミティブ型に対してある種のアライメントを指示することが許されています。一般的に、アラインメントは型のサイズです。しかし、それは完全に実装に依存します。
パディングバイトが導入され、すべてのオブジェクトが適切に整列されます。並べ替えは許されません。
おそらく、最新のコンパイラはすべて
#pragma pack
を実装しており、パディングの制御を可能にし、ABIに準拠することをプログラマに委ねています。(これは厳密には非標準ですが)。
C99 §6.7.2.1 より。
12 構造体またはユニオン・オブジェクトの各非ビットフィールド・メンバーは 構造体またはユニオンオブジェクトの非ビットフィールドの各メンバーは、実装で定義された方法で 実装で定義された方法で 配置されます。
13 構造体オブジェクトの中で 構造体オブジェクトの中で、ビットフィールドでない ビットフィールドが存在するユニットと ビットフィールドが存在するユニットのアドレスは 宣言された順番に増加するアドレスを持っています。 が宣言された順に増加するアドレスを持ちます。構造体オブジェクトへのポインタを適切に変換すると オブジェクトへのポインタは、適切に変換された後、次の場所を指します。 その初期メンバ(そのメンバがビットフィールドの場合 ビットフィールドであれば,その中のユニットを指します。 を指し、その逆も同様です。 構造体オブジェクトの中に無名のパディングがある場合があります。 構造体オブジェクトの中に無名のパディングがあってもよいのですが、その先頭にはありません。 構造体オブジェクトの先頭にはありません。
関連
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] C++の'struct'と'typedef struct'の違い?
-
[解決済み] .NETにおけるstructとclassの違いは何ですか?
-
[解決済み] C言語でのブーリアン値の使用
-
[解決済み] 構造体のsizeofは、なぜ各メンバーのsizeofの合計と等しくないのですか?
-
[解決済み] 構造体変数をコンソールに表示するには?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] なぜC言語では構造体を頻繁にtypedefする必要があるのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
警告:代入がキャストなしで整数からポインタを作成する場合の修正方法に関する警告
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] フリーは、どのように無料化を知っているのですか?
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する
-
[解決済み] 2次元配列の反復処理において、ループの順序がパフォーマンスに影響するのはなぜですか?