内存对齐

内存对齐

许多计算机系统对基本类型的合法地址做出了限制,要求某种类型的对象的地址必须是K(通常是2,4,8)的倍数。这被称为内存对齐。
为什么要有内存对齐?

  1. 提升内存读写性能,比如对于double对象,如果按8字节对齐,那么64位机器一次行就可以完成读写。
  2. 硬件强制要求,一般系统不进行内存对齐也可以正常运行,但有些系统必须要内存对齐才可以运行,比如某系统的SSE指令,必须要16位对齐才可以读写,否则终止程序运行。

复合类型内存对齐

对于struct这样的复合类型,其内存对齐值为系统最大对齐值和数据成员最大对齐值取最小,一般在32位系统系统最大对齐值为8,在64位系统最大对齐值为16。

struct Foo {
    char a;
    short b;
    int c;
};

上面的类型的内存对齐值alignof(Foo)等于4,在ab之间还有一个字节的填充字符。

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;
}
原文地址:https://www.cnblogs.com/HachikoT/p/14136177.html