精华内容
下载资源
问答
  • 结构体对齐原则

    2020-12-18 11:47:31
    结构体对齐原则 无论是数据类型自身,结构体成员自身,结构体自身都将按自身对齐值和指定对齐值中小的那个值进行对齐 注: 数据类型自身的对齐值: 对于char型数据,其自身对齐值为1,对于short型为2,对于int,...

    结构体对齐原则

    无论是数据类型自身 或 结构体成员自身 或 结构体自身 都将按自身对齐值和指定对齐值中小的那个值进行对齐

    注(引自:https://blog.csdn.net/zhanghow/article/details/55262988):

    1. 数据类型自身的对齐值: 对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节;
    2. 结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值;
    3. 指定对齐值:#pragma pack (value)时的指定对齐值value,32位机器默认为4,64位机器默认为8;
    4. 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。

    参考文档

    1. https://blog.csdn.net/zhanghow/article/details/55262988
      struct 字节对齐详解
    2. https://blog.shengbin.me/posts/gcc-attribute-aligned-and-packed
      GCC中的aligned和packed属性
    3. https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
      Specifying Attributes of Types
    展开全文
  • 简单易懂的C结构体对齐原则 结构体的对齐原则非常简单,只需要理解两个点就能透彻理解结构体对齐。分别是: 结构体内成员的对齐长度,该长度就是该成员的类型长度; 结构体的对齐长度,该长度默认情况下是成员类型...

    简单易懂的C结构体对齐原则

    结构体的对齐原则非常简单,只需要理解两个点就能透彻理解结构体对齐。分别是:

    1. 结构体内成员的对齐长度,该长度就是该成员的类型长度;
    2. 结构体的对齐长度,该长度默认情况下是成员类型长度最长的那成员的类型长度;

    详解

    • 原则1:(没有使用#pragma pack指令)

      结构体每个成员都有自己的对齐原则,该成员的对齐原则为该成员的类型长度的整倍数。

      A. 简单示例如下(暂时先不关注结构体的总长度):

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

      在上述结构体中,

      • 成员a的对齐长度为1,前面没有成员,自然就是第一个;
      • 成员b的对齐长度为2,此时已经存在的结构体长度为1,1/2 不是整倍数,那么就需要进行填充;填充一个字节就能是2的整倍数,算法就是(1%2)+1=2, 因此成员b放进去之后呢,该结构体的长度就为4了;
      • 成员c的对齐长度为4,前面的长度已经就是4了,4/4为整倍数,因此不需要填充。
      • 那么此时结构体的长度就为8

      B. 复杂示例如下(暂时先不关注结构体的总长度):

      struct B
      {
          short a;
          char b[11];
          short c[10];
          double d;
          int e;
      }
      

      这个是一个稍微复杂的例子,不过同样很简单。

      • 成员a的对齐长度为2,占两个字节,

      • 成员b的对齐长度为1,虽然b为数组,但是这里可以看成是多个连续的变量,因此他的对齐长度为1;当前结构体的长度为2,2/1是整倍数,因此不需要填充,然后当前结构体的长度为2+11 = 13;

      • 成员c的对其长度为2,同理,看做是一个连续的short成员;此时,当前结构体的长度为13,当前c的对齐长度为2, 13 /2 = 6.5,不是一个整倍数,那么就需要填充,算法为(2-(13%2))+13 = 14,因此成员c的起始位置为14,此时结构体的长度为14+ 10*2 = 34;((2-(13%2))解释,2为当前的对齐长度,13%2为取余数,那么用2减去余数就是差多少个到2,注意看下面以8为对齐长度的例子)

        (好了,如果认真看到这里的基本就明白是怎么回事了。如果自己还能动手算算的更棒了);

      • 成员d的对齐长度为8,此时结构体的长度为34,34/8 不能被整除,于是需要填充,填充字节数为 :8-(34%8), 起始位置:(8-(34%8))+34=40,因此成员d的起始位就是40了;(8-(34%8),34/8取余为2, 8-2当前的起始位置到8 还差6个字节)

      • 成员e的对齐长度为4,此时结构体的 48, 48/4可以整除,所以不需要填充。因此成员e的起始位置就为48了。因此此时结构体的长度就位52了。

      • 结构体中有结构体的情况看最下面的实例.

    • 原则2:(可以说是非常简单了)

      在没有使用#pragma pack(n)的情况下,结构体的总长度默认以最长的成员的长度作为对齐长度的。

      此处以上两个例子继续为例好了。上述的例子里面我们都没有计算整个结构体的总长度

      • 例子A

        当前A 的结构体长度为8,当前结构体中最大长度成员的对齐是c,对齐长度为4,按照上述的原则,当前结构体的对齐长度为4,那么8/4可以整除,那么当前结构体不需要填充。

      • 例子B

        当前B的结构体长度为52,然后结构体中最长的成员为d,该成员的长度为8,于是当前结构体的对齐长度为8,那么52/8 = 6.5,不是一个整倍数。那么说明需要填充操作。填充字节数:8 - (52%8), 8 - 4 = 4,则当前结构体需要填充4个字节,因此最终结构体B的总长度就为 52 + 4 = 56个字节。

        在这里插入图片描述

    #pragma pack(n), n ∈ {124816}

    #pragma pack改变的是结构体内所有成员的对齐长度原则,意思就是说,如果使用了该指令,上例中结构体成员的对齐长度也由该指令指定。

    例如示例A,如果加上了#pragma pack(1),结构体长度则为 1 + 2 + 4 = 7

    在这里插入图片描述

    示例B呢么,如果加上了#pragma pack(1), 那么结构体的长度则为:2+11+2*10+8+4=45

    在这里插入图片描述

    那么如果示例B来个pragma pack(3), 那就不好意思了。该指令的n的取值范围为 {124816}中的任意一个,其他任何非该取值范围的值都将使用当前的默认对齐当时。

    #pragma pack(push/pop)

    该指令代表pack的开始和结束,在此范围内的#pragma pack(n)离开该范围之后,就会恢复到#pragma pack(push)之前的对齐值。

    常见理解误区

    1. 结构体的对齐长度为 最长成员类型长度;

      解答:以上概念没什么问题,只是以上原则只是对上文中原则2的解释,所说的就只是结构体的对齐长度,而没有包含成员的对齐原则; 结构体的对齐长度可以通过预编译指令#pragma pack(n)进行改变;被#pragma pack(n)包含的结构体的成员和结构体的对齐值都为n;

    2. 结构体中包含结构体的情况中,那么外结构体的对齐长度为内结构的长度;

      解答:严格来说,这个说法是不正确的。在多层结构体中,外结构体的对齐长度仍然遵循原则2,内结构体的对齐长度为该结构体的对齐长度;

    在这里插入图片描述

    好了,不会算的多看两遍。动手就好。

    展开全文
  • C语言结构体对齐原则

    2017-08-18 11:38:00
    原则B:如果结构体A含有结构体成员B,那么B的起始位置必须是B中最大元素大小整数倍地址; 原则C:结构体的总大小,必须是内部最大成员的整数倍; 转载于:https://www.cnblogs.com/charlieqian/p/7388768.html...

    原则A:struct或者union的成员,第一个成员在偏移0的位置,之后的每个成员的起始位置必须是当前成员大小的整数倍;

    原则B:如果结构体A含有结构体成员B,那么B的起始位置必须是B中最大元素大小整数倍地址;

    原则C:结构体的总大小,必须是内部最大成员的整数倍;

    转载于:https://www.cnblogs.com/charlieqian/p/7388768.html

    展开全文
  • C/C++ 结构体对齐原则

    2017-05-16 21:43:59
    先介绍四个概念: 1)数据类型自身的对齐值:基本数据类型的自身对齐值,...4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。 有效对齐值N是最终用来决定数据存放地址方式的值,最重要。

    先介绍四个概念:
    1)数据类型自身的对齐值:基本数据类型的自身对齐值,等于sizeof(基本数据类型)。
    2)指定对齐值:#pragma pack (value)时的指定对齐值value。
    3)结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
    4)数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小的那个值。
    有效对齐值N是最终用来决定数据存放地址方式的值,最重要。有效对齐N,就是表示“对齐在N上”,也就是说该数据的”存放起始地址%N=0”.而数据结构中的数据变量都是按定义的先后顺序来排放的。第一个数据变量的起始地址就是 数据结构的起始地址。结构体的成员变量要对齐排放,结构体本身也要根据自身的有效对齐值圆整(就是结构体成员变量占用总长度需要是对结构体有效对齐值的整 数倍)

    1)#pragma pack (value)来告诉编译器,使用我们指定的对齐值来取代缺省的。
    如#pragma pack (1) /指定按2字节对齐/
    2)#pragma pack () /取消指定对齐,恢复缺省对齐/

    原则1:求一个结构体的字节数时,首先结构体成员要进行自对齐,第一个变量的起始偏移地址为0,下一个变量的起始偏移地址为有效对齐值的整数倍,往往通过填充字节来对齐。
    原则2:结构体本身要对齐,对齐原则为自身对齐值和指定对齐值中较大的那个值的整数倍。

    http://www.cnblogs.com/longlybits/articles/2385343.html

    展开全文
  • 关于结构体对齐的设置,以GCC 32bit编译为例,我们可以来看看下面这个例子:#include<stdio.h> //默认情况下,结构体一般在内存中的自动对齐格式是4...
  • C/C++中的结构体对齐原则

    千次阅读 2018-07-06 23:52:15
    1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,每个数据成员存储的起始位置要从该成员(每个成员本身)大小的整数倍开始(比如int在32位机为4字节,则要从4的整数...
  • 详解C语言结构体对齐(内存对齐问题)C语言结构体对齐也是老生常谈的话题了。内容虽然很基础,但一不小心就会弄错。我在刚开始接触的时候也会是很迷糊,通过编译器运行的结果总是和自己的不一样,使自己很苦恼。在网上...
  • C语言中结构体对齐,c语言结构体对齐,c语言结构体内存对齐,c语言结构体字节对齐,c语言中的结构体,c语言中结构体的使用,c语言中结构体,c语言中结构体的定义,c语言中结构体定义,c语言结构体C 语言中结构体对齐(来自网络...
  • 结构体内存对齐原则

    2018-03-23 12:35:39
    结构体对齐原则Ø 结构体是按照成员定义顺序存储的Ø 结构体第一个成员从offset为0的地址开始存储Ø 成员存储起始地址必须满足:min(“成员自身类型的模数”,“#pragam pack(x)”) 的整数倍,否则补齐直到满足Ø...
  • 结构体对齐

    2017-06-09 19:33:58
    结构体对齐
  • 结构体对齐原则

    2016-10-17 15:17:00
    1:结构体成员的起始位置都必须要从第一个成员的大小的整数倍位置开始 2:结构体的大小即sizeof得到的结果必须是结构体最大成员的整数倍 3:如果结构体的成员中还包含结构体成员,那么成员结构体的每一个成员的...
  • C语言中结构体对齐原则   原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机...
  • 结构体对齐详解

    2017-08-17 11:51:22
    结构体对齐详解 结构体数据成员对齐的意义 结构体对齐包括两个方面的含义 结构体大小的计算方法和步骤 结构体大小计算举例 null null char short int long float double long long long double Win-32 ...
  • C语言结构体对齐

    2019-04-12 15:26:06
    解析C语言结构体对齐(内存对齐问题) C语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。内容虽然很基础,但一不小心就会弄错。写出一个struct,然后sizeof,你会...有人给对齐原则做过总结,具体在哪...
  • 对齐原则: 原则1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较...
  • C语言字节对齐、结构体对齐最详细的解释

    万次阅读 多人点赞 2015-03-17 21:57:58
    如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。    二、为什么要字节对齐    需要字节对齐的根本原因在于CPU...
  • 结构体对齐问题

    2013-09-03 22:22:18
    C语言中结构体对齐问题2013-02-26 11:31:42 分类: LINUX  C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{ short a1; short a2; short a3; }A; struct{ long a1; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,476
精华内容 4,190
关键字:

结构体对齐原则