2016-08-17 53 views
4
struct 
{ 
    uint32_t i; 
    uint32_t i2; 
}s; 
printf("%p %p", &s.i, &s.i2); 

如果上述打印的例子:字节序是否影响结构构件是如何存储到存储器

这意味着,最上面的部件到该结构位于较小的存​​储器地址以及随后的元素以递增顺序存储在连续的地址处。

如果平台排列顺序颠倒了怎么办?这种模式会改变吗? 这是在某个C标准的规范中某处提到的吗?

+1

将错误类型传递给可变参数函数的未定义行为。 – EOF

+0

他/她意味着您的示例将不起作用,因此不会显示任何内容。但是......尽管你的例子,你的问题仍然存在。 – noelicus

+0

Endianess不应该有效果。结构的第一个元素的偏移量应始终为零。每个下一个元素的偏移量应该大于其前一个元素的偏移量。 – PSkocik

回答

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让你把指针好像他们是整数;格式说明符%tuptrdiff_t值打印为无符号数字。

你也可以做这样的:

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

Demo 2

5

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

Çstruct不是一个数字字(它不是与CPU处理的实体),因此答案是否定的,字节序不影响结构构件是如何存储到存储器

什么影响结构构件是如何存储到存储器是Data structure alignment,这可能会增加构件之间一些填充到对准构件地址以使其等于字大小

+1

注意:术语“数字字”在C中没有相关性。C中的字节顺序以C的存储器模型中连续的“字符”大小的单元格存储整数类型的方式表示。 – 2016-08-17 09:10:01

+0

@Rhymoid你是对的,这增加了理解endianness没有连接到C.“数字词”是维基百科中的_endianness_文章中使用的术语,我刚刚引用 – mvidelgauz

1

字节顺序是指处理器自然类型内的字节顺序:integersfloats。不管字节顺序如何,struct中的顶部元素总是会在内存中排在第一位。由于通常结构体被填充(字节对齐)依赖于编译器等,因此您必须考虑这些差距。

0

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

2

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

从N1570 6.7.2.1结构和联合指示符:

  • 如在6.2节中讨论。在图5中,结构是由组成的类型,其存储按照有序序列分配,并且联合是由存储重叠的成员的序列 组成的类型。
  • 虽然在成员之间和结构的结尾可能会有填充字节。