C++中类字段对齐与对象实例对齐的关系?

如何解决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 {...} 简单地指定对象实例对齐吗?

解决方法

标准如下:

[basic.align/2]

基本对齐由小于或等于所有上下文中实现支持的最大对齐的对齐表示,它等于 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 子对象的对齐要求。 — 结束示例]

还有[dcl.align/5]

声明中所有对齐说明符的组合效果不应指定比被声明的实体所需的对齐更不严格的对齐,如果属于该实体的所有对齐说明符都被省略。

[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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?