目前我正在调整我的分页结构,使用编译器特定的属性(例如,gcc的__attribute __(对齐)),但是我想使用C 11 alignas说明符,而不是Clang这是没有问题的,因为它很乐意接受4096对齐作为对齐的参数,但是G不是!
所以首先,alignas说明符和gcc __attribute __(对齐)之间的主要区别是显然都能保证与特定值的对齐,但是gcc中的alignas说明符似乎有128的限制,而属性似乎几乎是无限,为什么是这样?
为什么不能将一个const整数传递给alignas说明符?
解决方法
另外,从alignment support proposal(3.11):
A fundamental alignment is represented by an alignment less than or equal to the greatest alignment supported by the implementation in all contexts,which is equal to alignof(std::max_align_t) (18.1).
An extended alignment is represented by an alignment greater than
alignof(std::max_align_t). It is implementation-defined whether any extended
alignments are supported and the contexts in which they are supported (7.1.6). A type
having an extended alignment requirement is an over-aligned type.
同样的文件(7.1.6):
if the constant expression evaluates to an extended alignment and the implementation
does not support that alignment in the context of the declaration,the program is illformed
这可能也是答案的一部分.我目前无法访问完整的标准,有人应该可以确认.
对于__attribute __(aligned)和alignas之间的区别,我不认为它们在语义上是不同的,但是一个只是一个编译器扩展,另一个是由标准完全定义的.
为了回答你的最后一个问题,alignas只定义为:
alignas ( constant-expression ) alignas ( type-id )