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

时间:2016-08-17 08:55:50

标签: c

struct
{
    uint32_t i;
    uint32_t i2;
}s;
printf("%p %p", &s.i, &s.i2);

如果以上示例打印:

  

0 4

这意味着结构中最顶层的成员位于较小的内存地址,后续元素按递增顺序存储在连续的地址中。

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

5 个答案:

答案 0 :(得分:5)

Endianness refers to the order of the bytes comprising a digital word in computer memory

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

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

答案 1 :(得分: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);

Demo 1. intptr_t可让您将指针视为整数; %tu格式说明符将ptrdiff_t值打印为无符号数。

你也可以这样做:

struct S {
    uint32_t i;
    uint32_t i2;
};
printf("%tu %tu\n", offsetof(struct S, i), offsetof(struct S, i2));

Demo 2

答案 2 :(得分:2)

字节顺序不会影响成员的顺序。

从N1570开始6.7.2.1结构和联合说明符:

  
      
  1. 如6.2.5中所讨论的,结构是由成员序列组成的类型,其成员   存储按有序顺序分配,而union是由序列组成的类型   存储重叠的成员。
  2.   

虽然成员之间和结构末端可能有填充字节。

答案 3 :(得分:1)

字节顺序是指处理器的自然类型中的字节顺序:integersfloats。无论字节顺序如何,struct中的顶部元素始终位于内存中。您必须注意间隙,因为通常根据编译器等对结构进行填充(字节对齐)。

答案 4 :(得分:0)

结构成员的布局是依赖于实现的,因此它可以在编译器的品牌,选择的优化模式和目标体系结构之间变化。但是,通常情况下,endiannes本身就是多字节类型中的字节顺序(如int32),所以它不应该影响多字节数据块的顺序。