alignas
和 alignof
是 C++11 引入的两个关键字,它们与内存对齐相关,帮助开发者控制和查询数据的内存对齐方式。内存对齐可以提高访问数据时的性能,特别是在处理硬件层面要求严格的场景下。
1. alignas
alignas
是一个声明说明符,用来设置类型或对象的对齐方式。它允许开发者显式指定类型或对象的对齐方式,而不是依赖于编译器的默认对齐方式。
语法:
alignas(alignment) type variable;
其中 alignment
是一个整数或常量表达式,表示字节对齐数,type
是声明的类型,variable
是变量。
用法示例:
struct alignas(16) MyStruct {
int x;
float y;
};
在这个例子中,MyStruct
被指定为16字节对齐,即每个 MyStruct
类型的对象都必须在内存中以16字节对齐的方式存储。
作用:
- 对齐要求提升:对于某些硬件架构,特定数据类型(如 SIMD 向量)可能要求以某种特殊的对齐方式存储,
alignas
可以确保对象满足这些要求。 - 性能优化:合理使用对齐可以减少 CPU 的内存访问开销,提高程序的运行效率。
alignas
使用示例:
#include <iostream>
#include <cstddef> // for offsetof
struct alignas(32) MyVector {
float data[8];
};
int main() {
MyVector v;
std::cout << "Alignment of MyVector: " << alignof(MyVector) << std::endl;
std::cout << "Address of v: " << &v << std::endl;
return 0;
}
这个程序会输出 MyVector
的对齐方式(32字节)和对象 v
在内存中的地址,它通常是32的倍数。
2. alignof
alignof
是一个表达式操作符,用来返回类型或对象的对齐要求(以字节为单位)。可以理解为查询某个类型或对象的对齐方式。它通常用来检查系统默认的对齐策略。
语法:
alignof(type)
用法示例:
#include <iostream>
int main() {
std::cout << "Alignment of int: " << alignof(int) << std::endl;
std::cout << "Alignment of double: " << alignof(double) << std::endl;
std::cout << "Alignment of long long: " << alignof(long long) << std::endl;
return 0;
}
输出的结果会显示不同类型的数据在内存中的对齐方式,例如 int
可能是 4 字节,double
可能是 8 字节,long long
也是 8 字节。
作用:
- 查询对齐:开发者可以用
alignof
来查询特定类型的默认对齐方式。 - 硬件兼容性:有些硬件或库对某些类型的数据有特定的对齐要求,
alignof
可以帮助检查这些要求是否满足。
alignof
和 sizeof
区别:
sizeof
返回的是类型或对象占用的字节数。alignof
返回的是类型或对象的对齐要求,即在内存中该类型或对象如何对齐。
alignas
和 alignof
结合使用:
#include <iostream>
struct alignas(16) MyStruct {
int x;
double y;
};
int main() {
MyStruct s;
std::cout << "Alignof MyStruct: " << alignof(MyStruct) << std::endl;
std::cout << "Sizeof MyStruct: " << sizeof(MyStruct) << std::endl;
return 0;
}
在这个例子中,MyStruct
被指定为16字节对齐,alignof(MyStruct)
会返回16,而 sizeof(MyStruct)
会根据对齐规则返回 MyStruct
实际占用的内存大小。
内存对齐概念:
内存对齐是指数据在内存中的存储地址必须满足特定的对齐要求,通常是该类型大小的倍数。例如,int
类型通常对齐到4字节边界,double
类型通常对齐到8字节边界。
对齐的原因主要有以下几个方面:
- 硬件访问限制:某些硬件平台要求数据必须按特定边界对齐,否则会引发异常。
- 性能优化:CPU读取未对齐的数据可能需要更多的内存访问和处理步骤,降低性能。
总结:
alignas
:用于显式设置类型或对象的对齐方式。alignof
:用于查询类型或对象的对齐要求。- 内存对齐:是硬件、性能优化和正确性保证的重要机制,合理的对齐方式有助于提高程序性能。
alignas
可以帮助程序员在需要特殊对齐的场合手动指定对齐方式,而 alignof
则提供了一种机制来检查编译器为类型选择的对齐方式。