alignas说明符与__attribute __(对齐),c ++ 11

Ske*_*een 10 c++ gcc alignment clang c++11

我目前正在使用C++ 11开发OS内核,我遇到了一个问题,我似乎找不到自己的答案.

目前我正在使用编译器特定属性(例如gcc __attribute__(aligned))来调整我的分页结构,但是我想要使用C++ 11 alignas说明符,而在Clang ++上这不是问题,因为它很乐意接受4096对齐作为参数对齐,但G ++没有!

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

另外为什么不能将const整数传递给alignas说明符?

Thi*_*aut 6

从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 ) 
Run Code Online (Sandbox Code Playgroud)