怎么在c++中计算结构体与对象的大小

  介绍

今天就跟大家聊聊有关怎么在c++中计算结构体与对象的大小,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

C语言是什么

C语言是一门面向过程的,抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译,处理低级存储器。

如何计算结构体的大小

其实计算一个结构的大小的方法并不难,简单来说就是把结构体内的所有成员的大小相加就可以。但是,需要内存对齐那么究竟什么是内存对齐,又为什么要进行类型对齐呢?

<强>结构体的内存对齐

结构体内存对齐主要有两个步骤:

1。结构体各成员对齐。
2。结构体总体对齐

结构体内存对齐规则:

1。结构体的第一个成员在存放在结构体偏移量为0的位置
2。其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处. .

对齐数,=,编译器默认的一个对齐数与该成员大小的较小值。/*
  * *对中默认的值为8
  Linux中* *的默认值为4
  */

3。结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

4。如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

说了这么多,我们直接在VS环境下举几个例子给大家说明一下:

例1:

struct  S1   {   ,char  c1;   ,int 我;   ,char  c2;   };

(1)计算这个结构体的大小的时候,首先看c1的大小是1(字符类型),也即是说在结构体中c1存放的位置是结构体偏移量是0的位置

(2)接下来看我占4个字节,根据结构体对齐规则可知,c的有效对齐值为4 (4 & lt;8)对齐到4的整数倍地址,即地址偏移量为4处。(4 0的位置存放了c1,所以只能从4 1的位置开始存放)

(3)同(2)得出c2的存储位置是8

(4)此时内存中共有9个字节,进行结构体整体对齐,最大对齐数是4,即要求是4的整数倍,也就是12

怎么在c++中计算结构体与对象的大小

例2:

struct  S1   {   char  c1;   int 我;   char  c2;   };   struct  S2   {   char  a1;   struct  S1  s1;   int 我;   };

上面我们知道S1的大小是12日,现在我们计算一下S2的大小:

(1) a1占一个字节,放在结构体变量偏移量为0的地址处。

(2) s1占12个字节,对齐数4位(嵌套的结构体对齐到自己的最大对齐数的整数倍处,s1的最大对齐数是4),4 0处存放了a1,所以只能从4 1处开始存放

(3)我占了4字节,对齐数为4,s1一直存放到了15的位置,所以我只能从4 * 5=20的位置开始存储

(4)现在内存中共有20个字节,成员中最大对齐数是4,整体对齐时为4的倍数,所以结果是20

怎么在c++中计算结构体与对象的大小

注意:默认对齐参数是可以用# pragma包()设置的,例如下面的这个例子

# include  & lt; stdio.h>   # include  & lt; Windows.h>   # pragma 包(8)//设置默认对齐数为8   struct  S1   {   char  c1;   int 我;   char  c2;   };   # pragma 包()//取消设置的默认对齐数,还原为默认   # pragma 包(1)//设置默认对齐数为1   struct  S2   {   char  c1;   int 我;   char  c2;   };   # pragma 包()//取消设置的默认对齐数,还原为默认   int  main ()   {//输出的结果是什么?   printf (“% d \ n",, sizeof (struct  S1));   printf (“% d \ n",, sizeof (struct  S2));   系统(“pause");   return  0;   }

怎么在c++中计算结构体与对象的大小

<强>为什么存在内存对齐

1。平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。

怎么在c++中计算结构体与对象的大小