1

重複の可能性: 構造体の sizeof が各メンバーの sizeof の合計と等しくないのはなぜですか?

次のコードではstructSize、Arduino と私の PC (Ubuntu 11.04 x64) で実行されているかどうかによって、 の値が異なります。

struct testStruct{
    uint8_t val1;
    uint16_t val2;
};
...
uint_8_t structSize = sizeof(testStruct);

私の PC では の値structSizeは 4 で、私の Arduino では の値structSizeは 3 です (予想どおり)。

この 4 番目のバイトはどこから来たのですか?

4

3 に答える 3

3

uint16_t実際には、通常 16 ビットにアラインされているため、サイズは 4 であると予想していました。

余分なバイトは、 の位置合わせを維持するためにメンバー間に挿入されるパディングですuint16_t

ただし、これはコンパイラに依存します。Arduino はメモリに関して利己的である可能性があり、おそらく整列についてはあまり気にしません。(可能な説明)

于 2012-07-05T14:25:05.080 に答える
0

モバイル プロセッサで実行するデータベース エンジンを設計している場合はそのまま続行しますが、それ以外のほとんどの場合は、理解しやすく、アーキテクチャ全体で比較的標準的な型システムを使用して機能を構築することに時間を費やすことができます。

于 2012-07-05T14:46:36.223 に答える
0

これは、ターゲットにしている 2 つの CPU タイプ間で ABI が異なるためです。Arduino ( ARM v7?) では x86_64 とは異なるようです。

少なくとも x86 では、uint16_t(short) は一般に 2 バイト境界に揃えられます。これを実現するために、 の後に 1 バイトのパディングが挿入されval1ます。x86_64 でも同じだと思います。

これについては、ウィキペディアの x86 構造パディングに関する記事に多くの情報があります。

ディレクティブを使用して、あなたが望むものを達成できるかもしれません#pragma pack…しかし、ここではドラゴンです。私が提案したことを誰にも言わないでください:)

于 2012-07-05T14:29:11.857 に答える