ホームページ >バックエンド開発 >Golang >Go と C におけるデータ構造のアライメントの違い

Go と C におけるデータ構造のアライメントの違い

WBOY
WBOY転載
2024-02-09 15:51:091128ブラウズ

Go と C におけるデータ構造のアライメントの違い

php エディタ Xigua は、Go と C におけるデータ構造の配置の違いを紹介します。プログラミング言語において、データ構造のアライメントは、メモリ アクセス効率を向上させるために実行されるメモリ アライメント方法です。ただし、Go と C の間には、データ構造の調整という点でいくつかの違いがあります。 C 言語では、アライメントはコンパイラ設定によって制御されますが、Go 言語では、アライメントはコンパイラによって自動的に行われます。コードが C で記述されている場合、この違いにより Go でメモリ アクセス エラーが発生する可能性があります。したがって、開発者にとって、Go と C のデータ構造の配置の違いを理解することは非常に重要です。

質問内容

Cプログラムで構造体を初期化し、共有メモリにアタッチしました。構造は次のとおりです:

リーリー

Golang で書かれた別のプログラムから構造を読み取ろうとしています。 C の各フィールドが占めるバイト数を計算し、Golang 構造体に次のような同等のフィールドを用意しました。 リーリー

構造体 (

DrvSHMTagStruct) のサイズは、C では 182416、Golang では 182412 です (私のオペレーティング システムは ARM に基づいています)。では、なぜこのような違いがあるのでしょうか?これらは 4 バイト異なりますが、興味深いのは、どちらも正常に動作し、同じ構造でエラーなく読み書きできることです。

調べてみると、C コンパイラはコンパイル中にデータ構造の調整を行うことがわかりました。したがって、4バイトの差が生じます。しかし問題は、たとえ 4 バイトの違いがあるとしても、Golang プログラムはどのようにして共有メモリから構造体を正しく読み取ることができるのかということです。

また、ARM ベースの Linux でプログラムを実行すると、問題が発生します。 x64 Ubuntu では同じサイズです。

解決策

これは、最後のメンバー

インスタンス の入力です。 C バージョンでは、7 バイトが埋め込まれます。 Go バージョンでは 3 で埋められます。違いは、両方のプラットフォームで sizeof を実行するときに気づく 4 バイトです。

それらを同じにするには、C バージョンで

#pragma Pack(4) を使用するか、Go バージョンで #pragma Pack(8) を使用できます (サポートされている場合)。パッケージを削除するか、検索するとそうではないことがわかります)、または Go 構造体の最後のメンバーとしてフィラーを追加します: リーリー

以上がGo と C におけるデータ構造のアライメントの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。