内存对齐

内存对齐

许多计算机系统对基本类型的合法地址做出了限制,要求某种类型的对象的地址必须是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;
}
posted @   HachikoT  阅读(145)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示