如果数据地址的对齐与CPU相兼容,那么CPU读写内存时性能会更高。
因此在C++中,有时会希望在堆或栈中分配内存时,返回的地址能按照特定的长度对齐。
如果希望在栈中分配的内存时,返回地址按照特定长度对齐,可以使用 alignas,例如:
struct alignas(32) Foo {
Foo() { std::cout << this << std::endl; }
char c;
int i1;
int i2;
long l;
};main() {
Foo foo;
}
如果希望在堆中分配的内存时,返回地址按照特定长度对齐,可以使用 aligned_alloc
Foo *foo2 = (Foo*)aligned_alloc(4096, sizeof(Foo));
// 输出的地址总是按照4096对齐
cout << foo2 << " " << ((long)foo2) % 4096 << endl;
另外,malloc() 返回的地址,总是8字节对齐的(new也一样):
Aligned Memory Blocks (The GNU C Library)