在C/C++程序中,如果读写的数据地址,其对齐与CPU相兼容(64位CPU读写的内存地址是8的整数倍),那么CPU读写内存的性能会更高。
因此,C/C++在堆或栈中分配内存时,有时会希望返回的地址,按照特定字节数对齐。
1、如果希望在 栈中 分配的内存时,返回地址按照特定值对齐,可以使用 alignas 关键字,例如:
struct alignas(32) Foo {
Foo() { std::cout << this << std::endl; }
char c;
int i1;
int i2;
long l;
};main() {
// foo 的地址 &foo一定是32的整数倍
Foo foo;
cout << &foo << " " << ((long)&foo) % 32 << endl;
}
2、如果希望在 堆中 分配的内存时,返回地址按照特定值对齐,可以使用 aligned_alloc 函数,例如:
Foo *foo2 = (Foo*)aligned_alloc(4096, sizeof(Foo));
// 返回的地址总是4096的整数倍
cout << foo2 << " " << ((long)foo2) % 4096 << endl;
另外,malloc() 返回的地址,总是8字节对齐(32位cpu)或16字节对齐(64位cpu)(new也一样):