如何解决C++中类字段对齐与对象实例对齐的关系?
给定以下 C++ 类:
class X {
public:
uint8_t a;
uint32_t b[256] __attribute__((aligned(32)));
};
当 b
的实例大概是字对齐时,编译器如何确保 X
的存储是 32 字节对齐的? aligned
属性是否仅指定相对于对象实例起始地址的对齐方式?如果是这样,使 b
相对于地址空间对齐 32 字节的正确方法是什么?我应该使用 class alignof(32) X {...}
简单地指定对象实例对齐吗?
解决方法
标准如下:
基本对齐由小于或等于所有上下文中实现支持的最大对齐的对齐表示,它等于 alignof(std :: max_align_t) ([support.types])。一个类型作为完整对象的类型和作为子对象的类型使用时,其所需的对齐方式可能不同。 [示例 1:
struct B { long double d; };
struct D : virtual B { char c; };
当 D 是一个完整对象的类型时,它将有一个 B 类型的子对象,所以它必须适当地对齐一个 long double。如果 D 显示为另一个对象的子对象,而另一个对象也将 B 作为虚拟基类,则 B 子对象可能是不同子对象的一部分,从而降低了对 D 子对象的对齐要求。 — 结束示例]
声明中所有对齐说明符的组合效果不应指定比被声明的实体所需的对齐更不严格的对齐,如果属于该实体的所有对齐说明符都被省略。
[Example 1:
struct alignas(8) S {};
struct alignas(1) U {
S s;
}; // error: U specifies an alignment that is less strict than if the alignas(1) >were omitted.
— end example]
因此,从上面的部分(尤其是示例的解释)可以假设对象的对齐在其成员中被解析为最严格的。
class X {
public:
uint8_t a;
alignas(32) uint32_t b[256];
};
int main() {
X x1;
// alignas(16) X x; // Clang error: requested alignment is less than minimum alignment of 32 for type 'X'
alignas(64) X x2; // OK
alignof(X); // 32
alignof(x1); //32
alignof(x2); //64
alignof(x2.b); //32
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。