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

    参考:http://www.spongeliu.com/218.html

    内存对齐,是指一种计算机体系结构(如X86)对基本数据类型的存储位置有限制,要求其地址为某个数的倍数,通常这个数为4或8。这种要求会简化处理器的设计以及提升数据访问的效率。至于为什么会有这样的设计,简单的说访存总线的位数固定,以32位总线为例,地址总线的地址总是4对齐的,所以数据也四对齐的话,一个周期内就可以把数据读出。这里不理解的话可以跳过去,只要记得对齐这回事儿就行了。如果想更深入的理解,可以看这里另一篇文章

    知道这个之后,那么我们就可以理解,实际上是编译器为了效率,在相邻的变量之间放置了一些填充字节来保证数据的对齐。X86结构是4对齐的,所以sizeof(Node)是8不是5。

    再来看一个例子:

    struct node{
        int a;
        char b;
        char c;
        int d;
        char d;
    };

    这时的sizeof(Node)是多少呢?没错,是16。

    好的,既然我们知道对齐是由编译器来作的,那么我们可不可以更改对齐数呢? 答案是可以的,在C语言中,我们可以通过

    #pragma pack(n)

    来更改对齐模数。

    注:以上都是在现x86 linux下使用gcc编译器验证,不乏有其他系统和编译器会得到不同的结果。

    再让我们来看个例子:

            struct node {
                    double a;
                    int b;
                    int c;
                    char d;
            };

    这个时候的sizeof(node)是多少?20?24?

    其实,这个时候你会发现,当你在windows上使用VC编译的时候,你会得到24;当你在linux上使用gcc编译的时候,你会得到20!其实,这恰好说明这种数据的对齐是由编译器决定的!在VC中规定, 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;而在gcc中规定对齐模数最大只能是4,也就是说,即使结构体中有double类型,对齐模数还是4,所以数据是按照1,2,4对齐的。所以,在两个不同编译器上,你得到了不同的答案!

  • 相关阅读:
    页面框架布局
    socket、tcp、udp、http 的认识及区别
    servlet验证码的设置
    java换行符
    如何在jsp里禁止session
    EL和JSTL表达式
    C标签
    request与response
    文件上传与下载—>struts
    页面跳转
  • 原文地址:https://www.cnblogs.com/Lunais/p/7229867.html
Copyright © 2011-2022 走看看