内存对齐
许多计算机系统对基本类型的合法地址做出了限制,要求某种类型的对象的地址必须是K(通常是2,4,8)的倍数。这被称为内存对齐。
为什么要有内存对齐?
- 提升内存读写性能,比如对于
double
对象,如果按8字节对齐,那么64位机器一次行就可以完成读写。 - 硬件强制要求,一般系统不进行内存对齐也可以正常运行,但有些系统必须要内存对齐才可以运行,比如某系统的SSE指令,必须要16位对齐才可以读写,否则终止程序运行。
复合类型内存对齐
对于struct
这样的复合类型,其内存对齐值为系统最大对齐值和数据成员最大对齐值取最小,一般在32位系统系统最大对齐值为8,在64位系统最大对齐值为16。
struct Foo {
char a;
short b;
int c;
};
上面的类型的内存对齐值alignof(Foo)
等于4,在a
和b
之间还有一个字节的填充字符。
malloc怎么保证内存对齐
实际上malloc的实现已经考虑了内存对齐,标准保证返回的地址值可以让任何类型满足内存对齐的要求,在C11和C++11中还专门引入了max_align_t
这个类型来表示系统最大对齐值:
int main(int argc, char const *argv[])
{
// 输出16
std::cout << alignof(max_align_t) << std::endl;
void* p = malloc(1);
// 输出0xd13010
std::cout << p << std::endl;
return 0;
}