cari

Rumah  >  Soal Jawab  >  teks badan

c++ - 内存对齐?

内存对齐的原因在于,为了访问未对齐的内存,处理器需要作两次内存访问,请问这两次内存访问怎么解释?能够举个具体的例子?

ringa_leeringa_lee2808 hari yang lalu590

membalas semua(1)saya akan balas

  • 阿神

    阿神2017-04-17 11:10:55

    借回答这个问题的机会,自己也好好温习一下基础知识。切入正题:

    首先,明白基础概念:

    内存对齐,通常也称为数据对齐,是计算机对数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是某个值K(通常使2、4或8)的倍数。

    其次,理解数据对齐的目的:

    这种对齐限制简化了处理器与存储器系统之间接口的硬件设计。

    目前,主要软硬件厂商的观点:

    无论是否对齐,IA32等硬件都能正常工作,但建议要对齐数据以提高存储器系统的性能。

    目前,主流操作系统的的对齐策略:

    linux系统2字节数据类型(例如short)的地址必须是2的倍数,而较大的数据类型(例如int、int*、float和double)的地址必须是4的倍数;
    windows系统的策略则更严格,任何K字节基本对象的地址都必须是K的倍数,K=2, 4, 8。特别对于一个double或者long long类型数据的地址应该是8的倍数。

    最后,给出2个小的示例,假设一个处理器与存储器的接口(数据总线)是8字节(即64位),即处理器每次读取/写入的最小单元是8个字节。

    示例1:存储一个double变量 i

    上图中的未对齐部分,导致本来一次的存储器操作(0,7),变为2次(0,7), (8,15)。

    示例2:存储一个结构体变量

    struct s {
      int i;
      char c;
      int j;
    };
    


    上图中为了数据对齐,会在存储结构体的时候进行填充。对于不同的数据结构,填充的方式不同,有的是在中间部分填充,有的是在末尾部分填充,都是为了保证对齐。需要注意的是,对于这种结构体填充,不仅要保证结构体内部数据类型的对齐,还要保证整个结构体的对齐。

    PS: 最后推荐一本值得仔细读读的书:深入理解计算机系统(原书第2版),以上的引用部分,也是引用自这本书里面的内容。

    balas
    0
  • Batalbalas