zoukankan      html  css  js  c++  java
  • 内存对齐

    内存对齐

    许多计算机系统对基本类型的合法地址做出了限制,要求某种类型的对象的地址必须是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;
    }
    
  • 相关阅读:
    c#数组
    微软原版SQL Helper
    CROSS APPLY和 OUTER APPLY 区别详解
    Excel 开发备忘
    ZPL打印机公用代码
    SQL SERVER 索引维护
    C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)
    ZPL打印机命令解释
    在x64平台上调试依赖于x86的WCF服务
    SQL 行转列的两种做法
  • 原文地址:https://www.cnblogs.com/HachikoT/p/14136177.html
Copyright © 2011-2022 走看看