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コンパイラの大部分はこれをすべて処理する必要があります。そのため、おそらくジョブを実行するのに利用できるツールがほとんどないのです。
あなたのデータ構造は、あなたには、いくつかの簡単なヒューリスティックを適用し、「十分に良い」解決策を考え出すことができる、シンプルですが、何が起こるかの完全な一般には非自明である場合。
わかりませんが、ソースの構造体の配置を直接指定できます。 – BlackBear
質問は本当に意味をなさない - コンパイラは構造体の配置を決定します。 #pragmas。あなたは本当に何をしようとしていますか?モチベーションは何ですか? –
構造体に穴ができないようにしたいので、(#pragma packやその他のトリックを使わずに)構造体が最適にパックされるようにしますか? –