• 指针占的字节数和内存对齐


      定义hash节点的时候用到了构成双向链表的指针,想起来铮哥前些天说过的内存对齐,于是sizeof()了一下Node*的指针,发现指针是占4字节的,又用int*和char*都测试了一下,发现都是4字节。(我的操作系统是64位的。。。应该是因为我的visual studio软件是32位的原因)

      内存对齐例子:

    1.

    struct AA{

        char a;

        int b;

        char c; 

    }aa

    结果,sizeof(aa)=12 何解?首先假设结构体内存起始地址为0,那么地址的分布如下

    0  a

    1  

    2

    3

    4  b

    5  b

    6  b

    7  b

    8  c

    9

    10

    11

    2.

    struct AA{

        char a;

     char c; 

        int b;    

    }aa

    sizeof(aa)=8,为什么呢

    0  a

    1  c

    2

    3

    4  b

    5  b

    6  b

    7  b

    因为c为char类型,字对齐长度为1,所以可以有效的利用1-3间的空格。看见了吧,变量定义的位置的不同时有可能影响结构体的大小的哦!

    3.

    #pragma pack(2)

    struct AA{

        char a;

        int b;

        char c; 

    }aa

    sizeof(aa)=10 (用64位WIN10+ 32bit VS2017 实验输出是8?)

    为什么呢?a到c只占9字节长度,因为结构体的有效对齐长度在pack指定的2和int的4中取较小的值2。故取2的倍数10。如果当pack指定为8呢?那就仍然按4来对齐,结果仍然是12。

    4.

    struct AA{

        char a;

        int b;

        char c; 

    }__attribute__((__8__))aa

    sizeof(aa)=16,)

    为咩?其实a到c仍然只占9字节长度,但结构体以8对齐,故取8的倍数16.如果其指定2,则结果为10

    如果pragma pack和__attribute__ 同时指定呢?以__attribute__ 的为准。

    需要说明的是,不管pragma pack和__attribute__如何指定,结构体内部成员的自对齐仍然按照其自身的对齐值。

    大多数想法要么平庸,要么更糟糕,这很大程度上因为绝妙的想法难得一见,而且他们还要在我们身边这个充斥了各种恶俗的所谓常识的环境中孕育生长。
  • 相关阅读:
    小程序本地数据的存储
    cocos2d-x中CCTableView介绍
    C++中map容器的说明和使用技巧
    不修改代码,关闭vs2010 C4819警告
    Cocos2d-x 处理双击事件的两种方法
    Cocos2d-x 实现模态对话框
    Cocos2d-x init() 和 onEnter() 区别
    Cocos2d-x 中 CCProgressTimer
    Cocos2d-x 实现技能冷却效果
    输出第 n 个斐波纳契数(Fibonacci)
  • 原文地址:https://www.cnblogs.com/linux0537/p/8718113.html
Copyright © 2020-2023  润新知