zoukankan      html  css  js  c++  java
  • 浅谈结构体字节的求法

    两个原则(参考他人):

    1. 结构体每个成员相对结构体首地址的偏移量(offset)是对齐参数的整数倍,如有需要会在成员之间填充字节。编译器在为结构体成员开辟空间时,首先检查预开辟空间的地址相对于结构体首地址的偏移量是否为对其参数的整数倍,若是,则开辟空间,存放结构体,若不是,则多开辟一些空间到整数倍,而多开辟的空间填充在结构体成员之间。
    2. 结构体变量所占空间的总空间为对其参数的整数倍;如果最后一位结构体成员所占的字节数不能使字节数达到对齐参数的整数倍,则编译器会一直在后面开辟空间直到为对其参数的整数倍。

    在一般情况下,每个变量的对齐参数为其占的字节数,数组的对其参数为数组类型所占的字节数。对齐参数包括两部分,第一部分为结构体变量成员所占的字节数(每个结构体成员的对齐参数可能不同),第二部分为系统默认的对其参数#pragma pack(n),”n”可以为1,2,4,8等,系统一般默认为8,可以通过在头文件添加#pragma pack(n)来修改。

    在原则1中,编译器每次开辟空间所满足的对齐参数为每个结构体成员和系统默认参数的最小值;例入:int  a; int 为4;系统默认为8;即开辟的空间为4的倍数。

    在原则2中,对齐参数为结构体中每个成员类型所占字节最大值和系统默认对齐参数的最小值。

    注:在结构体中,如果有结构体指针,要记算在结构体所占的总字节内,结构体指针所占字节一般为8。

    不同的编译环境略有不同。

  • 相关阅读:
    Singleton patterns 单件(创建型模式)
    JS的运算问题……
    Java 新手学习日记一
    pycharm远程调试配置
    MATLAB2010安装方法
    人生三境界
    SAS数据步与过程步,数据步语句
    Google Chrome浏览器调试功能介绍
    认识Java标识符
    java多态和继承
  • 原文地址:https://www.cnblogs.com/kcy1122/p/12031905.html
Copyright © 2011-2022 走看看