2011-02-04 11 views
1

特定のCファイルセット内のすべての構造体のアラインメントを検証するツールはありますか?また、適切なパッキング(パディング)手動で行うことはできますか?必要な整列に従って骨格の必要な修正(パディング)を行い、結果ファイルを与えるツールはありますか?Cプログラム内のすべての構造体の最適なパッキングを確認するツール

このツールでは、(#pragma packや他のトリックに頼らずに)構造が最適にパックされるように、コンパイラが構造内に穴を残さないようにする必要があります。

WindowsやLinuxにこのようなツールが存在するかどうか教えてください。

+0

わかりませんが、ソースの構造体の配置を直接指定できます。 – BlackBear

+5

質問は本当に意味をなさない - コンパイラは構造体の配置を決定します。 #pragmas。あなたは本当に何をしようとしていますか?モチベーションは何ですか? –

+0

構造体に穴ができないようにしたいので、(#pragma packやその他のトリックを使わずに)構造体が最適にパックされるようにしますか? –

答えて

0

私の理解では、コンパイラは構造を自動的に正しい境界に揃えることができます。内部のフィールドは自動的に整列され、必要に応じて整列のためにフィールド間にパディングが挿入されます。

ここでの通常の質問は、「ランダム」アライメントで文字境界でパディングやオブジェクトを整列させる方法です。

多くのコンパイラがpack構造用にpragmaを提供していますが、構造をパックする標準オプションはありません。

異なるアラインメントでは、ダイナミックメモリを割り当てなければならず、構造体の先頭にポインタを介して構造体がアクセスする必要があります。

テキストの会話をする場合は、質問を編集して指定することができます。

+1

ご参考までに - 質問が更新され、あなたの回答はもはや適用されません – bdonlan

1

Cが混乱のすべてをバックアップに利用できるプリプロセッサでそのような制御されていない言語であるので、この仕事をするためのツールを書くことは非常に困難です。前処理されたコードを分析し、それをソースに関連付ける必要があります。簡単な部分は、基本タイプのアライメントルールを設定しています。

struct a_double { char byte; double d; }; 

タイプのために必要なアライメントがoffsetof(struct a_double, d)である:あなたのような構造のシリーズを使用することができます。

次に、ソース構造を解析して、各メンバーのアラインメントを計算する必要があります。しかし、あなたも対処する準備が必要です:

struct something 
{ 
    int a; 
    struct x 
    { 
     char b; 
     double c; 
     short s; 
    } d[12]; 
    union y 
    { 
     void (*function)(void); 
     struct z 
     { 
      char f[23]; 
      int g; 
     } p; 
     void *vp; 
    } e; 
}; 

それは決して重要ではありません。しかし、あなたはまた元に、それはのように見えたかもしれないことを覚えている:

struct something 
{ 
    TYPE1 a; 
    TYPE2 d[12]; 
    TYPE3 e; 
}; 

そしてTYPEnタイプはtypedefで、またはマクロ、またはのtypedefを特定するマクロ、または正常のいくつかの他の歪みかもしれません。そのような場合、ツールは何ですか?ソースに書かれたstruct somethingとプリプロセッサによって生成されたstruct somethingの間のマッピングを解決する必要がありますか? Cコンパイラの大部分はこれをすべて処理する必要があります。そのため、おそらくジョブを実行するのに利用できるツールがほとんどないのです。

あなたのデータ構造は、あなたには、いくつかの簡単なヒューリスティックを適用し、「十分に良い」解決策を考え出すことができる、シンプルですが、何が起こるかの完全な一般には非自明である場合。

0

GCCを使用している場合は、-Wpaddedでコンパイルして、パディングを任意の構造体に挿入すると警告することができます。追加されたパディングを確認する簡単な方法です。

関連する問題