php エディタ Xigua は、Go と C におけるデータ構造の配置の違いを紹介します。プログラミング言語において、データ構造のアライメントは、メモリ アクセス効率を向上させるために実行されるメモリ アライメント方法です。ただし、Go と C の間には、データ構造の調整という点でいくつかの違いがあります。 C 言語では、アライメントはコンパイラ設定によって制御されますが、Go 言語では、アライメントはコンパイラによって自動的に行われます。コードが C で記述されている場合、この違いにより Go でメモリ アクセス エラーが発生する可能性があります。したがって、開発者にとって、Go と C のデータ構造の配置の違いを理解することは非常に重要です。
Cプログラムで構造体を初期化し、共有メモリにアタッチしました。構造は次のとおりです:
リーリーGolang で書かれた別のプログラムから構造を読み取ろうとしています。 C の各フィールドが占めるバイト数を計算し、Golang 構造体に次のような同等のフィールドを用意しました。 リーリー
構造体 (DrvSHMTagStruct) のサイズは、C では
182416、Golang では 182412 です (私のオペレーティング システムは ARM に基づいています)。では、なぜこのような違いがあるのでしょうか?これらは 4 バイト異なりますが、興味深いのは、どちらも正常に動作し、同じ構造でエラーなく読み書きできることです。
また、ARM ベースの Linux でプログラムを実行すると、問題が発生します。 x64 Ubuntu では同じサイズです。 解決策これは、最後のメンバー
インスタンス の入力です。 C バージョンでは、7 バイトが埋め込まれます。 Go バージョンでは 3 で埋められます。違いは、両方のプラットフォームで
sizeof を実行するときに気づく 4 バイトです。
#pragma Pack(4) を使用するか、Go バージョンで
#pragma Pack(8) を使用できます (サポートされている場合)。パッケージを削除するか、検索するとそうではないことがわかります)、または Go 構造体の最後のメンバーとしてフィラーを追加します:
リーリー
以上がGo と C におけるデータ構造のアライメントの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。