• 结构体-内存对齐


     struct A{
       char c1;
       int i;
       short s;
       int j;
    }a;

    sizeof(a)的值是16。

    分析:char  c1占用1个字节

       int  i占用4个字节,c1不是i的整数倍,所以c1对齐为4个字节

         (c1 + i)占用8个字节

       short  s占用2个字节

            (c1 + i) 是s的整数倍,所以i不用对齐

            (c1+ i + s)占用10个字节

            int  j占用4个字节,(c1 + i + s)不是j的整数倍,所以s对齐为4个字节

            (c1 + i + s + j)占用16个字节,是占用字节最大的成员变量类型(int)所占字节数的整数倍,所以j不用对齐,所以sizeif(a)的值是16。

    struct B{
       int i;
       int j;  
       short s;
       char c1;
    }b;

    sizeof(b)的值是12。

    分析:

      int  i占用4个字节,int  j占用4个字节,i是j的整数倍,所以i不用对齐

      (i+j)占用8个字节,short  s占用2个字节,(i+j)是s的整数倍,所以j不用对齐

          (i+j+s)占用10个字节,char  c1占用1个字节,(i+j+s)是c1的整数倍,所以s不用对齐

      (i+j+s+c1)占用11个字节,不是占用字节最大的成员变量类型(int)所占字节数的整数倍,所以c1要对齐为2个字节

      所以sizeof(b)的值为12。

    对齐方法总结:

    1、前面的成员变量所占字节总数要是下一个成员变量所占字节数的整倍数。

       否则,前面的成员变量中的最后一个成员变量需要对齐,使前面的成员变量所占字节总数是下一个成员变量所占字节数的最小整数倍。

    2、所有成员变量所占字节总数要是占用字节数最大的成员变量的整倍数。

       否则,最后一个成员变量需要对齐,使所有成员变量所占字节总数要是占用字节数最大的成员变量的最小整倍数。

      

  • 相关阅读:
    编程语言是一种宗教
    execel 的java库
    c3p0配置学校
    Linux 文件命令精通指南
    几个WEB中常用的js方法
    不可多得的Javascript(AJAX)开发工具 - Aptana
    JDBC连不上Oracle数据库的解决方法
    利用PROFILE管理口令和资源
    ORACLE 数据库名、实例名、ORACLE_SID的区别
    用Java编写Oracle存储过程
  • 原文地址:https://www.cnblogs.com/panda1024/p/5569639.html
Copyright © 2020-2023  润新知