【问题标题】:Alignment of C structureC结构对齐
【发布时间】:2014-02-19 03:24:45
【问题描述】:

我在一个文件中有一些二进制数据,并将文件加载到内存char* data。现在我知道例如在偏移量 123 处开始一个 struct something。

执行以下操作是否安全

(struct something*) (data + 123) // ??&data [123]??

然后访问结构的成员。或者我应该做类似的事情

struct something record;
memcpy (&record, data + 123, sizeof (struct something) );

甚至是完全不同的东西?

我的问题主要是动机,因为我对“内存对齐”,“单词边界”等有一些模糊的回忆......

【问题讨论】:

    标签: c pointers memory-alignment word-boundaries


    【解决方案1】:

    是的,您应该使用memcpy,而不是指针转换,这正是您讨论的原因:对齐。转换指针是不安全的。如果对齐错误,C 标准不保证使用结果指针时的行为。

    在某些情况下,另一种方法是将数据直接读入对象。

    【讨论】:

    • 非常感谢。我很担心,我会坚持memcpy。附带说明:data + 123、&data[123] 和 &123[data] 之间有什么区别吗?还是只是语法糖?
    • @Hyperboreus:出于您的目的,这些表达式之间没有区别。 (我很想说没有,除非您可能需要括号以避免优先级问题;例如,pointer - data + 123 与 pointer - &data[123] 不同,但 pointer - (data + 123) 与后者相同。但是,要确保有即使在深奥的情况下也没有区别,我必须检查 C 标准,我现在时间紧迫。)
    • 附注:arm 内置 memcpy 在与未对齐数据一起使用时经常会导致转储,因此您可能需要禁用内置 memcpy 和 memmove(并使用 libc 版本) 如果您遇到该问题(取决于编译器)。
    【解决方案2】:

    这取决于。

    在某些现代 CPU(如 x86)上,可以访问未对齐的字以进行读/写操作,并且没有性能损失,尽管某些特定指令可能需要对齐的操作数(如 PPC 上的 CAS 指令)。

    【讨论】:

      猜你喜欢
      • 2013-07-24
      • 2016-02-23
      • 1970-01-01
      • 2013-06-03
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多