【问题标题】:c++ alignment of struct with aligned membersc++ 结构与对齐成员对齐
【发布时间】:2012-02-12 12:44:16
【问题描述】:

struct 是否总是与该结构的最大对齐成员对齐?如果没有,如何自动执行,也许使用 gcc 特定的扩展? (我知道有__attribute((aligned(...)))__,但必须明确指定对齐方式)。

这种行为在 c99、c++99 和 c++11 之间有区别吗? c++11 是否有一些额外的规定来强制对齐?

示例: 使用以下代码,Foo 本身会自动对齐到 8 个字节,还是我也需要显式对齐?

struct Foo{
    int i __attribute__((aligned(8)));
};

【问题讨论】:

  • @Basile:我添加了示例,应该清楚。
  • 复合类型的对齐方式确实是其最大成员的对齐方式。想想那些类型的数组!
  • 为什么要担心对齐问题?编译器通常在这方面做得很好!
  • @Basile:当必须对齐的类型(数据包数学)分配到非对齐地址时,我会崩溃。 (你可以放心地假设我问的时候有充分的理由问)
  • @KerrekSB:您能否参考您所说和所写的内容作为答案,以便我接受?谢谢!

标签: c++ struct memory-alignment


【解决方案1】:

对齐是系统和处理器特定的属性。允许编译器尽其所能(并且必须了解处理器和系统的对齐约束)。

大多数 ABI 规范(例如 Linux 的 AMD64 ABI)包含一些对齐提示。

我确实相信对齐约束会从字段传播到包含它们的聚合(例如struct-s)。

如果您对动态分配的数据有不寻常的对齐约束,您可能需要明确对齐,例如通过使用posix_memalign 分配它们。 malloc 和相关的分配器(包括 C++ 中的 ::operator new)可能不会比默认约束要求的更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多