alignas specifier vs __attribute__(aligned), c++11

alignas specifier vs __attribute__(aligned), c++11

本文关键字:c++11 aligned attribute specifier vs alignas      更新时间:2023-10-16

我目前正在用c++ 11开发一个操作系统内核,我遇到了一个问题,我自己似乎找不到答案。

目前我正在对齐我的分页结构,使用编译器特定的属性(例如。gcc的__attribute__(aligned)),但是我想使用c++ 11 alignas说明符代替,在clang++上这是没有问题的,因为它很乐意接受4096对齐作为alignas的参数,但是g++没有!

所以首先,alignas specifier和gcc __attribute__(aligned)之间的主要区别是什么,显然两者都确保对齐到特定的值,但是gcc中的alignas说明符似乎有128的限制,而属性似乎几乎是无限的,为什么会这样?

为什么不能传递const整数到alignas说明符?

从GCC的支持状态来看,在GCC 4.7中似乎不完全支持对齐,但在GCC 4.8中是支持的。alignas也被列为4.8版本页面中新支持的特性。

同样,从对齐支持提案(3.11):

基本对齐表示为小于或等于在所有上下文中实现支持的最大对齐,即alignof(std::max_align_t)(18.1)。

扩展的对齐方式由大于的对齐方式表示alignof (std:: max_align_t)。它是实现定义的,无论是否有任何扩展支持对齐以及支持对齐的上下文(7.1.6)。一个类型具有扩展对齐要求的是过度对齐类型。

从同一文档(7.1.6):

,如果常量表达式的计算结果为扩展对齐和实现在声明的上下文中不支持这种对齐,程序是不正确的

这可能也是答案的一部分。我目前无法获得完整的标准,应该有人能够确认这一点。

关于__attribute__(aligned)alignas的区别,我不认为它们在语义上有什么不同,但一个只是一个编译器扩展,而另一个是完全由标准定义的。

回答你的最后一个问题,alignas只定义为:

alignas ( constant-expression ) 
alignas ( type-id ) 

它们的位置不同。属性(aligned)可以作为函数的返回类型,但alignas不能。语义上是相同的