繁体   English   中英

alignas 说明符 vs __attribute__(aligned), c++11

[英]alignas specifier vs __attribute__(aligned), c++11

我目前正在用 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 ) 

它们在可以定位的位置方面有所不同。 属性(对齐)可以作为函数的返回类型,但 alignas 不能。 在语义上它们是相同的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM