我正在使用C++中的字节,并且想知道内存中的字节顺序,同时考虑结构成员之间的填充,以及系统的endianness是否会影响该结构在内存中的字节顺序。
假设我有struct:
struct MyStruct {
unsigned char a;
int b;
};
成员a
占用4个字节(添加了填充),成员b
也占用4个字节。问题是:字节顺序是否影响a
在内存中的字节顺序?
假设a = 0x01
和b = 0x00000000
;字节顺序是否为:
0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
...对于big-endian和little-endian系统,或者可以是:或
0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00
2条答案
按热度按时间ao218c7q1#
成员
a
占用4个字节(添加了填充),成员b
也占用4个字节。问题是:字节顺序是否影响a
在内存中的字节顺序?也许这里有个误会。成员
a
的类型是unsigned char
,所以它总是占用一个字节的内存,因为sizeof(unsigned char) == 1
。但是,编译器可能会在
struct
成员之间插入填充字节。这些填充字节不属于任何成员,而是属于struct
本身。这主要是为了确保后续成员的正确对齐。在你的例子中可能会发生什么:无论有多少填充字节,
a
总是出现在struct
的开头,所以唯一法律的的内存布局方式是:当涉及到成员的位置时,平台的字节序是小字节序还是大字节序是无关紧要的。endianness仅指定对象内部的字节如何布局。
struct
成员之间的填充与此无关,它是对象大小和对齐的结果。标签:Is a struct's address the same as its first member's address?
[[gnu::packed]]
)来消除struct
成员之间的填充字节。*inb24sb22#
字节顺序是否影响内存中的“a”字节顺序?
a
是一个单字节对象。它的布局不受字节顺序的影响。字节顺序也不会影响内存中结构体成员的顺序。
字节顺序是否为0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00?
在这种情况下,保证第一个字节是
a
的字节。如果您对类型的填充和大小的假设与实现细节相匹配,那么在本例中答案是肯定的。