c++ 字节序是否影响结构成员在内存中的位置?

eqqqjvef  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(126)

我正在使用C++中的字节,并且想知道内存中的字节顺序,同时考虑结构成员之间的填充,以及系统的endianness是否会影响该结构在内存中的字节顺序。
假设我有struct:

struct MyStruct {
    unsigned char a;
    int b;
};

成员a占用4个字节(添加了填充),成员b也占用4个字节。问题是:字节顺序是否影响a在内存中的字节顺序?
假设a = 0x01b = 0x00000000;字节顺序是否为:

0x01 0x00 0x00 0x00    0x00 0x00 0x00 0x00

...对于big-endian和little-endian系统,或者可以是:或

0x00 0x00 0x00 0x01    0x00 0x00 0x00 0x00
ao218c7q

ao218c7q1#

成员a占用4个字节(添加了填充),成员b也占用4个字节。问题是:字节顺序是否影响a在内存中的字节顺序?
也许这里有个误会。成员a的类型是unsigned char,所以它总是占用一个字节的内存,因为sizeof(unsigned char) == 1
但是,编译器可能会在struct成员之间插入填充字节。这些填充字节不属于任何成员,而是属于struct本身。这主要是为了确保后续成员的正确对齐。在你的例子中可能会发生什么:

struct MyStruct {
    unsigned char a = 1;

    // e.g. three padding bytes inserted between a and b
    char __padding__[alignof(int) - 1];

    int b = 0;
};

无论有多少填充字节,a总是出现在struct的开头,所以唯一法律的的内存布局方式是:

01 ?? ?? ?? ... ?? 00 00 00 00

当涉及到成员的位置时,平台的字节序是小字节序还是大字节序是无关紧要的。endianness仅指定对象内部的字节如何布局。struct成员之间的填充与此无关,它是对象大小和对齐的结果。
标签:Is a struct's address the same as its first member's address?

  • 注意:如果确实需要,您可以使用非标准属性(如[[gnu::packed]])来消除struct成员之间的填充字节。*
inb24sb2

inb24sb22#

字节顺序是否影响内存中的“a”字节顺序?
a是一个单字节对象。它的布局不受字节顺序的影响。
字节顺序也不会影响内存中结构体成员的顺序。
字节顺序是否为0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00?
在这种情况下,保证第一个字节是a的字节。如果您对类型的填充和大小的假设与实现细节相匹配,那么在本例中答案是肯定的。

相关问题