C结构的对齐
我在一个文件中有一些二进制数据,并在C结构的对齐,c,pointers,memory-alignment,word-boundaries,C,Pointers,Memory Alignment,Word Boundaries,我在一个文件中有一些二进制数据,并在char*data处将该文件加载到内存中。现在我知道了,例如,在偏移量123处,开始一个struct something 这样做安全吗 (struct something*) (data + 123) // ??&data [123]?? 然后访问结构的成员。或者我应该做类似的事情 struct something record; memcpy (&record, data + 123, sizeof (struct something) )
char*data
处将该文件加载到内存中。现在我知道了,例如,在偏移量123处,开始一个struct something
这样做安全吗
(struct something*) (data + 123) // ??&data [123]??
然后访问结构的成员。或者我应该做类似的事情
struct something record;
memcpy (&record, data + 123, sizeof (struct something) );
甚至是完全不同的东西
我的问题主要是出于动机,因为我对“内存对齐”、“单词边界”等有一些模糊的记忆。是的,您应该使用
memcpy
,而不是指针转换,原因正是您所讨论的:对齐。转换指针是不安全的。如果对齐错误,则C标准不保证使用结果指针时的行为
在某些情况下,另一种选择是直接将数据读入对象。这取决于具体情况
在某些现代CPU(如x86)上,访问未对齐的字进行读/写操作是可以的,并且没有性能损失,尽管某些特定指令可能需要对齐的操作数(如PPC上的CAS指令)。非常感谢。我担心会这样,我会坚持使用
memcpy
。旁注:data+123
、&data[123]
和&123[data]
之间有什么区别吗?还是仅仅是句法上的糖分?@Hyperboreus:就你的目的而言,这些表达之间没有区别。(我很想说没有,除非您可能需要括号来避免优先级问题;例如,pointer-data+123
不同于pointer-data[123]
,但是pointer-(data+123)
将与后者相同。但是,为了确保即使在深奥的情况下也没有差异,我必须检查C标准,目前时间紧迫。)一方面注意:在arm上内置的memcpy
在与未对齐的数据一起使用时经常会导致转储,因此,如果遇到内置的memcpy
和memmove
(并使用libc版本)问题(取决于编译器),您可能需要禁用它们。