alignas specifier 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 )
它们的位置不同。属性(aligned)可以作为函数的返回类型,但alignas不能。语义上是相同的
- MSVC是否支持C++11样式的属性而不是__declspec
- 创建LinkedList退出,返回代码为-11(SIGSEGV)
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何将模板转换为C++11之前的模板
- c++11评估顺序(未定义的行为)
- C++中的VLA,扩展名为std=C++11
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- "类模板示例<int>;"语句对 C++11 是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 如何使用lock_guard在c++11中实现scoped_lock功能
- C++11 中不同类型的对象的 std::array 的替代方案
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 为什么我的C++代码中出现'Segmentation Fault: 11'行?
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- STLPort using C++11
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 C++11 中,如何查找并返回以给定字符串开头的字符串向量中的所有项?
- alignas specifier vs __attribute__(aligned), c++11