我目前正在使用C ++ 11开发操作系统内核,我遇到了一个问题,我似乎找不到自己的答案。
目前我正在使用编译器特定属性(例如gcc的__attribute__(aligned)
)来调整我的分页结构,但是我想要使用C ++ 11 alignas说明符,而在Clang ++上这不是问题,因为它乐意接受4096对齐作为alignas的参数,但是G ++没有!
首先,alignas specifier
和gcc __attribute__(aligned)
之间的主要区别是什么,显然两者都确保与特定值对齐,但gcc中的alignas说明符似乎有限制128,虽然属性似乎几乎是无限的,为什么会这样?
为什么不能将const整数传递给alignas说明符?
答案 0 :(得分:6)
从GCC支持状态来看,gcc 4.7并未完全支持对齐支持,但它适用于gcc 4.8。 alignas
也被列为4.8 release page。
另外,来自alignment support proposal(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 )
答案 1 :(得分:0)
在放置位置方面有所不同。可以将属性(已对齐)作为函数的返回类型,但是alignas不能。在语义上它们是相同的。