zoukankan      html  css  js  c++  java
  • C/C++ 结构体内存对齐

        内存对齐是指的是编译器在编译的时候总是会将结构体的元素的地址放在一些合适的位置使得CPU访问这些数据的效率变得更高。首先来看下面这个例子:

    struct A
    {
    char a;
    char b;
    int c;
    };
    struct B
    {
    char a;
    int b;
    char c;
    };

    sizeof(A) = ?      sizeof(B) = ?

    正确的结果应该是sizeof(A) = 8,sizeof(B) = 12。因为CPU在访问这些数据的时候,每次只能读一定长度的数据,在这里,假如struct B中a的地址0,b的地址是1,c的地址是5,那么,当CPU要访问b的时候,会这样访问,首先访问0-3,取前三个字节,然后再访问4 - 7,然后只取第一个字节,把两次访问的汇总起来才得到所要的b。而CPU访问内存其实是比较慢的,而如果我把这三个元素的地址设置成如下:&a = 0  ,  &b = 4,&c = 8,那么这是CPU访问b的话,就只要访问一次了,大大提高访问的效率。所以编译器在进行编译的时候都会做这个优化,按照占用字节数最长的元素来进行对齐处理。这个优化对于程序员来说是透明的,然而C/C++总是这么灵活,我们也可以手动干预来按照自己的需要设置对齐的方式,那就是用#pragma pack(n),这样就是按照n个字节来对齐。所以,上面两个例子如果在前面加上#pragma pack(1),那么两个结果都将会是6.

  • 相关阅读:
    暗通道先验去雾算法及其几何意义的解释
    几种去雾算法介绍
    大气散射模型的推导
    散射介质环境中偏振成像图像的去散射方法
    最近的笔面试题知识整理一
    了解 Web Service
    数梦工厂笔试题回顾一----finally在return之后执行还是之前?
    Struts2的配置文件的加载
    Struts2中Action配置
    struts.xml的语法
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/4356963.html
Copyright © 2011-2022 走看看