zoukankan      html  css  js  c++  java
  • 指定字节对齐方式

    今天看到内存字节对齐的东西,就认真的看了起来,一点睡意都没有了。

    对于内存字节对齐

    #pragma pack(push,n)
    

    表示一下结构或类成员以n字节方式对齐,注意并不是每个成员都是占用n个字节,而是取min(成员类型,n)。记住这一点就不怕再算错了。

    #pragma pack()
    

    表示内存字节对齐方式到此结束。

    下面写写几个例子:

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

    结构体A占用的字节数计算方法如下:int =4,存放在[0]~[3] char 存放在[4],short占两个字节,所以char后面空一个字符,short放在[6]~[7] 共占用8个字节的内存。sizeof(A)=8.

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

    结构体B占用的字节数计算方法如下:char =1,存放在[0], int=4,所以char后面要空出来3个字节,然后在存放int类型,即存放在[4]~[7],short占两个字节,所以结构体共占十个字节,但是10不是最大类型(占4个字节)的整数倍10/4,距离10最近的整数倍是12,所以sizeof(B)=12. 

    下面来看一下指定字节对齐的计算方式

    #pragma pack(push,4)
    struct A{
        int a;
        char b;
        short c;
    }
    #pragma pack()
    

    一定要记住min(成员类型,n),使用公式可以计算得到int =4,char=1(但是后面的short比char大,所以一后面的为准。char=1然后空出1个字节,后面再放short)short=2。所以sizeof(A)=8。

    #pragma pack(push,4)
    struct B{
        char b;
        int a;
        short c;
    }
    #pragma pack()
    

    按照上面的计算方法得出sizeof(B)= 12。

    #pragma pack(push,2)
    struct A{
        int a;
        char b;
        short c;
    }
    #pragma pack()
    

    按照上面的计算方法得出sizeof(B)= 8。

    总结:<1>公式min(成员类型,n)

        <2>看下一个成员类型是否比自己少,没有的话按照下一个计算。

    作者:first_semon
             
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。如有问题,欢迎交流
  • 相关阅读:
    Redis下载及安装(windows版)
    orcal 游标使用
    ORCAL查看表空间情况
    通过解密f5的cookie信息获得服务器真实内网IP
    jsonp挖掘技巧
    PoCBox
    burpsuite爆破401认证
    lkwa靶场之盲RCE
    redis未授权访问
    docker删除镜像+端口占用
  • 原文地址:https://www.cnblogs.com/first-semon/p/7241329.html
Copyright © 2011-2022 走看看