1

私は構造を持っているとしましょう:

struct myStruct
{
    int a;
    short b;
    char c;
};

Windows では、 MSDN は、 4 バイト、2 バイト、および 1 バイトを取ると述べてい ます。これは合計で最大 7 バイトです。intshortchar

ほとんどのコンパイラは、アラインメントを改善するために不特定のバイト数で構造体をパディングすることを理解しています。したがって、このプログラムを実行すると、

#include <stdio.h>

int main(void) {
    printf("%d\n", sizeof(struct myStruct));
    return 0;
}

の出力が得られます8。これは、1 バイトがパディングされたことを意味します。

コード内のサイズを保守的に決定できる方法はありますかstruct(個々の s を合計する以外にsizeof)?

後で構造を変更して約 15 個の要素を含める必要があり、さらに 5 個の構造を追加すると、すべてstruct sizeofの が変更されて混乱が生じるためです。

4

2 に答える 2

3

あなたはそれを強制することができます:

#define C_ASSERT(expr) extern char CAssertExtern[(expr)?1:-1]

C_ASSERT(sizeof(struct myStruct) == 7); // or 8, whichever you want

サイズが 7 から逸脱するたびに、コードはコンパイルを停止します。

構造体メンバーのオフセットを強制するために、同様のことを行うことができます。offsetof()そのためにはマクロが必要です。

于 2013-04-10T06:24:49.723 に答える
0

プラグマパックを試すことができます。アライメントを維持するのに役立ち、多くの柔軟性があります。これをチェックしてください http://publib.boulder.ibm.com/infocenter/comphelp/v101v121/index.jsp?topic=/com.ibm.xlcpp101.aix.doc/compiler_ref/pragma_pack.html

更新:あなたのコメントを見たばかりですが、おそらくパックはあなたの解決策ではありません

于 2013-04-10T06:50:46.383 に答える