`
444878909
  • 浏览: 638270 次
文章分类
社区版块
存档分类
最新评论

内存对齐规则

 
阅读更多


在没有#pragma pack宏的情况下,内存对齐的规则如下:

规则1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

规则2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

规则3:收尾工作,结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍.不足的要补齐.

规则1示例:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    struct A{
        int *a;
        short b;
        int c;
        char d;
        float e;
        double f;
    };
    struct A a;
    printf("0x%x [0,1,2,3]\n",&a.a);
    printf("0x%x [4,5]\n",&a.b);
    printf("0x%x [8,9,10,11] 规则1\n",&a.c);
    printf("0x%x [12]\n",&a.d);
    printf("0x%x [16,17,18,19] 规则1\n",&a.e);
    printf("0x%x [24,25,26,27,28,29,30,31]\n",&a.f);
    printf("%d\n",sizeof(struct A));
    return 0;
}


规则2示例:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    struct B{
        char a;
        int b;
    };
    struct A{
        int *a;
        short b;
        struct B b1;
        int c;
        char d;
        float e;
        double f;
    };
    struct A a;
    printf("0x%x [0,1,2,3]\n",&a.a);
    printf("0x%x [4,5]\n",&a.b);
    printf("0x%x [8] 规则2\n",&a.b1.a);
    printf("0x%x [12,13,14,15]\n",&a.b1.b);
    printf("0x%x [16,17,18,19] 规则1\n",&a.c);
    printf("0x%x [20]\n",&a.d);
    printf("0x%x [24,25,26,27] 规则1\n",&a.e);
    printf("0x%x [32,33,34,35,36,37,38,39]\n",&a.f);
    printf("%d\n",sizeof(struct A));
    return 0;
}


规则3示例:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    struct A{
        short a;
        double b;
    };
    struct A a;
    printf("0x%x [0,1]\n",&a.a);
    printf("0x%x [8,9,10,11,12,13,14,15] 规则1\n",&a.b);
    printf("%d 规则3\n",sizeof(struct A));
    return 0;
}


使用#pragam pack(n)更改编译默认的对齐方式:

规则4:告诉编译器,所有的对齐按照min(n,当前成员的大小)的整数倍进行对齐。

规则5:收尾工作,结构体的总大小,也就是sizeof的结果,必须是min(n,其内部最大成员的大小)的整数倍.不足的要补齐.

#include <stdio.h>
#include <stdlib.h>

#pragma pack(4)

int main(int argc, char *argv[])
{
    struct A{
        short a;
        short b;
        double c;
    };
    struct A a;
    printf("0x%x [0,1]\n",&a.a);
    printf("0x%x [2,3] 规则4\n",&a.b);
    printf("0x%x [4,5,6,7,8,9,10,11] 规则4\n",&a.c);
    printf("%d 规则5\n",sizeof(struct A));
    return 0;
}


参考:http://blog.csdn.net/hairetz/article/details/4084088


分享到:
评论

相关推荐

    C++内存分配的对齐规则

    C++里的内存资源对齐规则,从更深刻的角度向大家展示了指针的密码

    内存对齐规则之我见1

    1. 对于结构体的各个成员,第一个成员的偏移是0,排在后面的成员其当前偏移必须是当 2. 结构体内所有数据成员各自内存对齐后,结构体本身还要进一次内存对齐,保证

    内存对齐的规则以及作用 - 蜗牛小居 - C++博客1

    1. re: 内存对齐的规则以及作 2. re: 内存对齐的规则以及作 3. re: 内存对齐的规则以及作 4. re: 内存对齐的规则以及作 5. re: 内

    内存对齐 详细介绍内存对齐的原理

    关于内存对齐的很详细的解析.内容有什么是内存对齐,为什么需要内存对齐,编译器对内存对齐的处理,栈内存对齐等,并附有验证代码.值得一看.

    内存对齐详解

    详细解读内存对齐原则,通过实例让你完全掌握内存对齐。

    C语言中内存对齐规则讨论

    但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就是需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。大部分的参考资料都是如是说的:①、平台原因(移植原因)...

    C/C++内存对齐.pdf

    介绍C/C++中内存对齐(字节对齐)的概念以及对齐规则。通过示例代码和图示帮助理解。

    数据结构内存地址对齐方法

    数据结构内存地址对齐方法对于不是很了解内存地址对齐的人来说很有帮助 通过规则和实例进行说明

    C++面试题之结构体内存对齐计算问题总结大全

    本文给大家介绍的是关于C++结构体内存对齐计算的相关内容,内存对齐计算可谓是笔试题的必考题,但是如何按照计算原则算出正确答案一开始也不是很容易的事,所以专门通过例子来复习下关于结构体内存对齐的计算问题。...

    C语言内存对齐实例详解

    但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理...

    教你5分钟轻松搞定内存字节对齐

    随便google一下,人家就可以跟你解释的,一大堆的道理,我们没怎么多时间,讨论为何要对齐.直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则

    VC++中内存对齐实例教程

    为了优化CPU访问和优化内存,减少内存碎片,编译器对内存对齐制定了一些规则。但是,不同的编译器可能有不同的实现,本文只针对VC++编译器,这里使用的IDE是VS2012。 #pragma pack()是一个预处理,表示内存对齐。...

    一文全面掌握底层难点C和C++中的字节对齐(含C源码)

    几种类型数据所占字节数 什么是对齐 自然对齐 规则对齐 实验对比 ...内存对齐的规则 #pragma pack()用法详解 例子 对齐的作用和原因 举个例子 什么时候需要进行内存对齐. 对齐的实现 总结

    解析C语言中结构体struct的对齐问题

    首先看一下结构体对齐的三个概念值: 数据类型的默认对齐值(自身对齐): 1.基本数据类型:为指定平台上基本类型的长度。如在32位机器中,char对齐值为1,short为2,int,float为4,double为8; 结构体:其数据成员...

    字节对齐以及为什么要字节对齐

    现代计算机中内存空间都是按照BYTE划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间...

    C++对象内存分布详解(包括字节对齐和虚函数表)

    1、C++对象的内存分布和虚函数表: C++对象的内存分布和虚函数表注意,对象中保存的是虚函数表指针,而不是虚函数表,虚函数表在编译阶段就已经生成,同类的不同对象中的虚函数指针指向同一个虚函数表,不同类对象的...

    C/C++结构体对齐规则

     那么经过sizeof后得出结果是 12, 因为默认内存占用4byte, 变量a占用1byte,剩下3个,不足以存放变量b,故变量a也占用了4byte, 变量c由于后面没有了数据, 也会变为4byte,后sizeof值为12。 #include "stdafx....

Global site tag (gtag.js) - Google Analytics