命名空间
变体
操作

alignas 说明符 (C++11 起)

来自 cppreference.cn
< cpp‎ | language
 
 
C++ 语言
通用主题
流程控制
条件执行语句
if
迭代语句 (循环)
for
范围 for (C++11 起)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常规范 (在 C++11 中弃用*)
noexcept 说明符 (C++11 起)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11 起)
auto (C++11 起)
constexpr (C++11 起)
consteval (C++20)
constinit (C++20)
存储期说明符
初始化
表达式
备选表示
字面量
布尔 - 整型 - 浮点
字符 - 字符串 - nullptr (C++11 起)
用户定义 (C++11 起)
实用工具
属性 (C++11 起)
类型
typedef 声明
类型别名声明 (C++11 起)
转型
内存分配
类特有函数属性
虚函数
override 说明符 (C++11 起)  
final 说明符 (C++11 起)
explicit (C++11 起)
static

特殊成员函数
模板
模板特化
形参包 (C++11 起)
杂项
 
 

指定类型或对象的对齐要求

内容

[编辑] 语法

alignas( 表达式 )
alignas( 类型标识 )
alignas( ... )
1) 表达式 必须是 整型常量表达式,求值结果为零,或者为对齐或扩展对齐的有效值。
2) 等价于 alignas(alignof( 类型标识 ))
3) 等价于应用于同一声明的多个 alignas 说明符,形参包的每个成员一个,可以是类型形参包或非类型形参包。

[编辑] 解释

alignas 说明符可以应用于

  • 的声明或定义;
  • 非位域类数据成员的声明;
  • 变量的声明,但不能应用于以下情况
    • 函数形参;
    • catch 子句的异常形参。

由此类声明声明的对象或类型将使其对齐要求等于声明中使用的所有 alignas 说明符的最严格(最大)非零 表达式,除非它会削弱类型的自然对齐。

如果声明中最严格(最大)的 alignas 比没有任何 alignas 说明符的对齐方式弱(即,比其自然对齐方式弱,或者比同一对象或类型的另一个声明上的 alignas 弱),则程序是非良构的

struct alignas(8) S {};
struct alignas(1) U { S s; }; // error: alignment of U would have been 8 without alignas(1)

无效的非零对齐,例如 alignas(3) 是非良构的。

有效的非零对齐,但比同一声明上的另一个 alignas 弱,则会被忽略。

alignas(0) 始终被忽略。

[编辑] 注意

从 ISO C11 标准开始,C 语言具有 _Alignas 关键字,并将 alignas 定义为在头文件 <stdalign.h> 中扩展为关键字的预处理器宏。

在 C++ 中,这是一个关键字,并且

头文件 <stdalign.h><cstdalign> 不定义此类宏。但是,它们定义了宏常量 __alignas_is_defined

(直到 C++20)

头文件 <stdalign.h> 不定义此类宏。但是,它定义了宏常量 __alignas_is_defined

(自 C++20 起)

[编辑] 关键字

alignas

[编辑] 示例

#include <iostream>
 
// Every object of type struct_float will be aligned
// to alignof(float) boundary (usually 4):
struct alignas(float) struct_float
{
    // your definition here
};
 
// Every object of type sse_t will be aligned to 32-byte boundary:
struct alignas(32) sse_t
{
    float sse_data[4];
};
 
int main()
{
    struct default_aligned
    {
        float data[4];
    } a, b, c;
    sse_t x, y, z;
 
    std::cout
        << "alignof(struct_float) = " << alignof(struct_float) << '\n'
        << "sizeof(sse_t) = " << sizeof(sse_t) << '\n'
        << "alignof(sse_t) = " << alignof(sse_t) << '\n'
        << std::hex << std::showbase
        << "&a: " << &a << "\n"
           "&b: " << &b << "\n"
           "&c: " << &c << "\n"
           "&x: " << &x << "\n"
           "&y: " << &y << "\n"
           "&z: " << &z << '\n';
}

可能的输出

alignof(struct_float) = 4
sizeof(sse_t) = 32
alignof(sse_t) = 32
&a: 0x7fffcec89930
&b: 0x7fffcec89940
&c: 0x7fffcec89950
&x: 0x7fffcec89960
&y: 0x7fffcec89980
&z: 0x7fffcec899a0

[编辑] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
CWG 1437 C++11 alignas 可以用于别名声明 禁止
CWG 2354 C++11 alignas 可以应用于枚举的声明 禁止

[编辑] 参考

  • C++23 标准 (ISO/IEC 14882:2024)
  • 9.12.4 传递依赖属性 [dcl.attr.depend]
  • C++20 标准 (ISO/IEC 14882:2020)
  • 9.12.3 传递依赖属性 [dcl.attr.depend]
  • C++17 标准 (ISO/IEC 14882:2017)
  • 10.6.3 传递依赖属性 [dcl.attr.depend]
  • C++14 标准 (ISO/IEC 14882:2014)
  • 7.6.4 传递依赖属性 [dcl.attr.depend]
  • C++11 标准 (ISO/IEC 14882:2011)
  • 7.6.4 传递依赖属性 [dcl.attr.depend]

[编辑] 参见

alignof (C++11 起) 查询类型的对齐要求
(运算符)[编辑]
获取类型的对齐要求
(类模板) [编辑]
C 文档 关于 _Alignas, alignas