zoukankan      html  css  js  c++  java
  • 结构对齐问题

    结构体默认的字节对齐一般满足三个准则:
    1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
    2) 结构体每个成员相对于结构体首地址的偏移量(offset,即每个成员的起始地址)都是成员自身大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
    3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
    注意:当结构体成员里面有数组成员时,如int a[10],要看成10个整形变量才参与计算。
     
    在某些时候也可以设置字节对齐方式。这就需要使用 #pragma pack
    #pragma pack(push) //压栈保存
    #pragma pack(1)// 设置1字节对齐
    struct
    {
    char a;
    short b;
    char c;
    }S1;
    #pragma pack(pop) // 恢复先前设置
    如上所示,将对其方式设为1字节对齐,那么S1就不填充字节,sizeof为各元素所占字节之和即4。这一点在从外部2进制文件中读入struct大小的数据到struct中,是很有用的.
    另外,还有如下的一种方式:
    · __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
    · __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
  • 相关阅读:
    Python os.fchdir() 方法
    Python os.dup2() 方法
    JavaScript——三
    JavaScript——二
    JavaScript函数console、this关键字
    JavaScript——DOMM
    JavaScript——浏览器检查
    JavaScript——匿名函数和闭包
    JavaScript——原型
    JavaScript——面向对象与原型
  • 原文地址:https://www.cnblogs.com/hewei2012/p/2765452.html
Copyright © 2011-2022 走看看