12

私は言われました:

[ABI]は、構造体の正確なレイアウト、すべてのメンバーのバイトオフセット、ビットフィールドに使用されるビット、パディングの場所と量などを保証します。

しかし、私は常に、パディングと配置が指定されておらず、信頼性が低いと信じていました。

Itanium ABI (GCCが使用)は実際にこれらのことを指定していますか(が知る限り、範囲を指定しているようには見えません)?

もしそうなら、そのようなオプションはどのよう__attribute__ ((packed))にそれに適合しますか?彼らは最終的に物事の配置を変えることによってABIを破りますか?

または、引用が示すように、パッキングはツールチェーン間で指定されていないだけですが、実際には特定のABIの使用内で信頼性があり予測可能ですか?そして、繰り返しますが、そのようなものはどのよう__attribute__ ((packed))にそれに適合しますか?

4

2 に答える 2

2

パディングと配置はISO標準C++仕様で指定されていないため、信頼性がありません。

引用での「正確」という言葉の使用は誇張です。Itanium ABI (GCCが使用)は、常に正確にではなく、必要に応じて(指定範囲内で)これらのものを指定する場合があります。

実際、パッキングは、事前に決定されたターゲットアーキテクチャと環境を想定したツールチェーンの使用において、信頼性が高く予測可能です。ABI。他の構成のように、ツールチェーンに適用可能なすべてのターゲット固有の詳細が事前に決定されている場合__attribute__ ((packed))、ツールチェーンが正しく機能するための出力が予測どおりに生成されます。

于 2013-04-10T09:47:12.170 に答える
1

参照により組み込まれている標準のドキュメントに従う必要があります。

ほとんどのタイプのサイズと配置は、Intel SystemVABI仕様で指定されています。たとえば、long longタイプlong doubleのサイズと配置は、Unix System Vアプリケーションバイナリインターフェイス、Itaniumプロセッササプリメント(番号245370-001)、表3-1追加の基本データタイプに記載されています。

特に実際の標準プロセスがないため、標準の信頼できるコピーを見つけるのは少し難しいです。LP64 ABIのすべてのタイプのサイズと配置を含む適切なリファレンスは、ILP32 ABIをカバーしていませんが、http: //www.x86-64.org/documentation/abi.pdfです。

__attribute__((packed))#pragma packもちろん、MSVCの場合と同様に、gcc固有です。コンパイラの互換性機能を使用して、コンパイラ間で構造体の一貫したレイアウトを取得できる場合がありますが、互換性機能が実装されているという理由だけで動作が同じであると想定することはお勧めできません。サイズとキーオフセットが同じであることをテストする必要があります。

于 2012-11-27T10:39:28.900 に答える