12

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

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

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

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

4

2 回答 2

7

从 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 ) 
于 2013-03-20T15:08:13.287 回答
0

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

于 2020-12-17T17:23:14.897 回答