endianness是否会影响结构成员如何存储到内存中

Hai*_*iri 5 c

struct
{
    uint32_t i;
    uint32_t i2;
}s;
printf("%p %p", &s.i, &s.i2);
Run Code Online (Sandbox Code Playgroud)

如果以上示例打印:

0 4

这意味着进入结构的最顶层成员位于较小的存储器地址,并且随后的元素以递增的顺序存储在连续的地址处.

如果平台字节顺序被反转怎么办?这种模式会改变吗?这是在某些C标准的规范中提到的吗?

mvi*_*auz 5

字节顺序是指包含计算机存储器中的数字字的字节的顺序

C struct不是数字字(它不是CPU处理的实体),所以答案是否定的,字节顺序不会影响结构成员如何存储到内存中

影响结构成员如何存储到内存中的是数据结构对齐,它可以在成员之间添加一些填充以对齐成员地址,使其等于字大小的某个倍数


das*_*ght 5

字节顺序不是决定struct成员抵消过程中的一个因素.初始成员将始终在零偏移处分配; 其余成员将按照它们在struct声明中出现的顺序以较高的抵消额进行分配.

与系统无关的程序编码方式如下:

struct {
    uint32_t i;
    uint32_t i2;
}s;
intptr_t p = (intptr_t)&s;
intptr_t pi = (intptr_t)&s.i;
intptr_t pi2 = (intptr_t)&s.i2;
printf("%tu %tu\n", pi-p, pi2-p);
Run Code Online (Sandbox Code Playgroud)

演示1. intptr_t让你把指针看作是整数; %tuformat specifier将ptrdiff_t值打印为无符号数.

你也可以这样做:

struct S {
    uint32_t i;
    uint32_t i2;
};
printf("%tu %tu\n", offsetof(struct S, i), offsetof(struct S, i2));
Run Code Online (Sandbox Code Playgroud)

演示2.