zoukankan      html  css  js  c++  java
  • 自然对齐/指定字节对齐---个人笔记

      关于字节对齐,有时候真的不是很清楚,每个编译器都有自己的规定,而大多数都遵循自然对齐:就是取该数据结构中所占内存空间最大的那个变量对齐(先检查占内存较大的那个的大小,而其后的变量则向其靠齐)

    typedef struct aa{

      char a;

      short b;  

    }_aa;

    _aa A;

    A.a='1';

    A.b=7788;

    sizeof(A)? 答案为4.他们怎么存放的?小端模式下:

        --------0x0

      a |  '1' |0x1

      b | 88 |0x2

        | 77  |0x3

        |  *  |

        --------

    那么这个呢?

    typedef struct _aa{

      char a;

      int   b;  

    }__aa;

    __aa A;

    A.a='1';

    A.b=123456;

    sizeof(__aa)? 答案为8. 他们怎么存放的?

       --------0x0

      a |   '1'   |0x0

         |    0   |0x1

         |    0   |0x2

         |    0   |0x3

      b | 56 |0x4

         | 34  |0x5

         |  12   |0x6

         |  00   |0x7

        --------

    #include <stdio.h>
    typedef struct stu1{    
      char array[7];
    }stu1;
    typedef struct stu2{    
      double fa;
    }stu2;
    typedef struct stu3{    
      stu1 s;
      char str;
    }stu3;
    typedef struct stu4{    
      stu2 s;
      char str; 
    }stu4;
    void main()
    {
      printf("sizeof(stu1) :	%d
    ",sizeof(stu1)); 
      printf("sizeof(stu2) :	%d
    ",sizeof(stu2));
      printf("sizeof(stu3) :	%d
    ",sizeof(stu3));
      printf("sizeof(stu4) :	%d
    ",sizeof(stu4));
    }

    sizeof(stu1) : 7
    sizeof(stu2) : 8 
    sizeof(stu3) : 8 //向 占内存大的靠齐
    sizeof(stu4) : 16
    Press any key to continue

    #include <stdio.h>
    #pragma pack (1) /*指定按1字节对齐*/
    typedef union stu1{    
      char str[10];
      int b;
    }stu1;
    #pragma pack () /*取消指定对齐,恢复缺省对齐*/
    typedef union stu2{    
      char str[10];
      int b;
    }stu2;
    void main()
    {
      printf("sizeof(stu1) :	%d
    ",sizeof(stu1)); 
      printf("sizeof(stu2) :	%d
    ",sizeof(stu2)); 
    }

    sizeof(stu1) : 10
    sizeof(stu2) : 12
    Press any key to continue
    怎么回事?
    由于之前我们一直都在使用struct,所以在这里我们特地例举了一个union的代码来分析下,我们大家都知道union的大小取决于它所有的成员中占用空间最大的一个成员的大小。由于在union stu1中我们使用了1字节对齐,所以对于stu1来说占用空间最大的是char str[10]类型的数组,,其值为10。为什么stu1为10而stu2却是12呢?因为在stu2的上面我们使用了#pragma pack () ,取消指定对齐,恢复缺省对齐。所以由于stu2其中int类型成员的存在,使stu2的对齐方式变成4字节对齐,也就是说,stu2的大小必须在4的对界上,换句话说就是stu2的大小要是4的整数倍,所以占用的空间变成了12





  • 相关阅读:
    Consul注销实例
    sql优化基础篇
    linux下执行java类(运行java定时器)
    ExecutorService 的理解与使用
    精度计算的方法
    内部类详解
    接口的作用
    面向对象之继承和组合浅谈
    构造器前篇
    教师编制考试数据分析
  • 原文地址:https://www.cnblogs.com/chengliangsheng/p/3601002.html
Copyright © 2011-2022 走看看