パッキングによるオブジェクトファイルのオーバーヘッドをカウント/合計したい(そして、理想的には、gccに最小化させたい)。
たとえば、次の構造(32ビットx86、gcc)について考えてみます。
struct a {
uint8_t a_char;
uint32_t an_integer
uint8_t another_letter;
};
実際のデータは6バイトしか使用しませんが、両方の文字の後に3つのパディングバイトが続くため、構造体はメモリ内で12バイトを使用します。次のように構造を並べ替えることによって:
struct b {
uint32_t an_integer
uint8_t a_char;
uint8_t another_letter;
};
構造体のsizeof(struct b)== 8のみになります(まだ4バイトのオーバーヘッド)。
(1)理想的には、gccを再配置struct a
しstruct b
てスペースを節約したいのですが、私のバージョン(4.2)は、どの最適化レベルでもこれを実行していないようです。
(2)または、与えられた場合、数(オーバーヘッドの合計量)または(メンバーが「理想的に」注文されている場合はオーバーヘッドの最小量)のstruct a
いずれかを(自動的に)取得したいと思います。これの目的は、構造を手動で並べ替える価値があるかどうかを判断することです(おそらくそうではありません)。6
4
gccが(1)を実行する方法はありますか?また、(2)を実行するツールはありますか?(1)について私が考えることができる最も近いことは#pragma pack(1)
ですが、(私が推測しているように)ほとんど/すべてのメモリアクセスを非整列にすることにより、パフォーマンスに深刻な影響を及ぼします。(2)の場合、デバッグシンボルを解析するPerlスクリプトでこれを実行できる可能性があると思いますが、DWARFに精通していないため確実に知ることができません。