`
provista
  • 浏览: 120402 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(转)内存对齐

阅读更多
为了让CPU能够更舒服地访问到变量,struct中的各成员变量的存储地址有一套对齐的机制。这个机制概括起来有两点:第一,每个成员变量的首地址,必须是它的类型的对齐值的整数倍,如果不满足,它与前一个成员变量之间要填充(padding)一些无意义的字节来满足;第二,整个struct的大小,必须是该struct中所有成员的类型中对齐值最大者的整数倍,如果不满足,在最后一个成员后面填充。维基百科的Data Structure Alignment页面有如下表述:
引用
The type of each member of the structure usually has a default alignment, meaning that it will, unless otherwise requested by the programmer, be aligned on a pre-determined boundary. The following typical alignments are valid for compilers from Microsoft, Borland, and GNU when compiling for 32-bit x86:

    * A char (one byte) will be 1-byte aligned.
    * A short (two bytes) will be 2-byte aligned.
    * An int (four bytes) will be 4-byte aligned.
    * A float (four bytes) will be 4-byte aligned.
    * A double (eight bytes) will be 8-byte aligned on Windows and 4-byte aligned on Linux.
    * A long double (twelve bytes) will be 4-byte aligned on Linux.
    * Any pointer (four bytes) will be 4-byte aligned on Linux. (e.g.: char*, int*)

The only notable difference in alignment for a 64-bit Linux system when compared to a 32 bit is:

    * A double (eight bytes) will be 8-byte aligned.
    * A long double (Sixteen bytes) will be 16-byte aligned.
    * Any pointer (eight bytes) will be 8-byte aligned.

验证程序如下:
#include <stdio.h>

struct s {
    char a;
    short b;
    char c;
    double d;
    char e;
};

int main() {

    struct s s1;

    printf("%d, %d, %d, %d, %d\n",
        (char*)(&s1.a) - (char*)(&s1),
        (char*)(&s1.b) - (char*)(&s1),
        (char*)(&s1.c) - (char*)(&s1),
        (char*)(&s1.d) - (char*)(&s1),
        (char*)(&s1.e) - (char*)(&s1));
    printf("%d\n", sizeof(struct s));

    return 0;
}

在64位linux下面运行这段代码的结果是:
引用
0, 2, 4, 8, 16
24

由于对齐机制的存在,实际上上面的struct在内存中是长这个样子的,共计24个字节:
struct s {
    char a;             //在地址为0的位置
    char padding1[1];   //由于下面一个元素是short,对齐字节数为2的位数,需要补1字节
    short b;            //对齐到了地址为2的位置
    char c;             //在地址为4的位置
    char padding2[3];   //由于下面一个元素是double,对齐字节数为8的倍数,需要补3字节
    double d;           //对齐到了地址为8的位置
    char e;             //在地址为16的位置
    char padding3[7];   //整个struct的大小需要是对齐数最大者,也就是double的8字节的整数倍
};
如果是在32位的linux下跑上面的程序,由于double的长度还是8字节,但是对齐是4字节的了,所以前面几个成员的位置不变,而最后的padding只需要补3个字节就可以了,所以输出的结果是0, 2, 4, 8, 16及20.

对于windows,其32位和64位下double都是8字节对齐的,所以在32位和64位下跑这个程序结果都是0, 2, 4, 8, 16及24.

最后,整个struct的大小的要求是对齐值最大者的整数倍,没有什么默认的4或者8的倍数一说。如果把上面程序中的a,b,c,d,e的类型全变成char,那么最后的他们的地址会是0,1,2,3,4,整个struct的大小 sizeof(struct s)的值是5,没有任何padding发生。

以上程序实验的环境在64位centos x64上的gcc 4.1.2(32位结果加-m32参数)及Visual Studio 2008上得出。
转载自http://blog.loudly.me/2010/02/memory_alignment/
分享到:
评论

相关推荐

    内存对齐的问题 内存对齐内存对齐

    内存对齐,值得一读的内容, 内存对齐,值得一读的内容, 内存对齐,值得一读的内容, 内存对齐,值得一读的内容,

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

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

    面试题1—内存对齐

    面试的时候内存对齐问的比较多,特从网上总结的面试题1.

    sizeof(结构体)和内存对齐

    sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐 sizeof(结构体)和内存对齐

    C中内存对齐

    c语言内存对齐问题的描述,数据在计算机内存中的存储

    内存对齐详解

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

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

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

    C++内存对齐

    C++内存对齐是个看似简单,但大家经常容易犯错的地方,本文详细总结了C++内存对齐,尤其是结构体对齐方面的知识,提出了自己理论总结,希望能对读者有参考价值!

    计算机编程时使用到的内存对齐问题解答

    本资源附有本人精心设计的内存对齐PPT以及示例程序,保证您看完本资源后完全掌握内存对齐问题。

    结构体大小-详解内存对齐问题

    该文档提供了详细解决结构体sizeof问题,从结构体内变量所占空间大小,默认内存对齐大小,强制内存对齐方法,变量在内存中布局的详细分析,语言言简意赅,绝无废话,为读者解决了大量寻找书籍的烦恼,读者可以花费几分钟的...

    5分钟搞定内存字节对齐

    写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢?讲讲字节对齐吧.

    关于结构体的内存对齐

    关于结构体的内存对齐关于结构体的内存对齐关于结构体的内存对齐

    c++ 内存对齐的完整文档

    c++ 内存对齐的完整文档 c++ 内存对齐的完整文档 c++ 内存对齐的完整文档

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

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

    深入理解c/c++ 内存对齐

    内存对齐,memory alignment.为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。内存对齐...

    内存对齐规则

    说明: 1.为什么需要内存对齐? 2.总结结构中内存对齐的规则

    内存分配对齐策略

    内存分配对齐策略 学习c/c++内存管理分配机制的同学们,这是一本必看的文档,你懂的

    C/C++内存对齐.pdf

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

    C++ 内存对齐原则及作用

    C++ 内存对齐原则及作用 C++ 内存对齐原则及作用 C++ 内存对齐原则及作用

Global site tag (gtag.js) - Google Analytics