计算结构体的大小

简介: 计算结构体的大小

结构体内存对齐

下面通过一段代码比较来看

struct S1
{
  char c1;
  int i;
  char c2;
};
struct S2
{
  char c1;
  char c2;
  int i;
};
struct S3
{
  double d;
  char c;
  int i;
};
struct S4
{
  char c1;
  struct S3 s3;
  double d;
};
int main()
{
  cout << sizeof(S1) << endl;//12
  cout << sizeof(S2) << endl;//8
  cout << sizeof(S3) << endl;//16
  cout << sizeof(S4) << endl;//32
  return 0;
}

似乎结构体的大小并不是结构体类每个成员大小之和,

这里我们就要涉及到结构体的内存对齐

如何计算?

对齐规则

1.第一个成员在与结构体变量偏移量为0的地址处。

2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。

VS中默认的值为8

Linux中没有默认对齐数,对齐数就是成员自身的大小

可与使用#pragma去修改默认对齐数

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

4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整

体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍

为什么对有内存对齐

大概就是,结构体的内存对齐是拿空间来换取时间的做法。

那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:

让占用空间小的成员尽量集中在一起。

eg:

struct S1
{
 char c1;
 int i;
 char c2;
};//12
struct S2
{
 char c1;
 char c2;
 int i;
 };//8

S1和S2类型的成员一模一样,但是S1和S2所占空间的大小有了一些区别.

目录
相关文章
|
3月前
|
C语言
【C语言】库宏offsetof(结构体成员偏移量计算宏)
【C语言】库宏offsetof(结构体成员偏移量计算宏)
33 0
|
3月前
|
存储 编译器 Linux
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
【C语言】自定义类型:结构体深入解析(二)结构体内存对齐&&宏offsetof计算偏移量&&结构体传参
|
11月前
|
Serverless
结构体-时间的计算
结构体-时间的计算
|
11月前
|
存储 C++
32.【C/C++ 结构体全类型 (详解)】(二)
32.【C/C++ 结构体全类型 (详解)】
59 0
|
3月前
函数与结构体
函数与结构体
28 3
|
3月前
|
存储 编译器 Linux
自定义类型(结构体,结构体的存储大小如何计算)
结构:是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。结构体定义由关键字 struct和结构体名组成,结构体名可以根据需要自行定义。其中的struct是定义结构体类型的关键字(必须要写);Stu是当前结构体的字名(可以不写);大括号里面的age,name是成员变量。
36 0
|
10月前
|
存储 C语言
浅谈结构体类型
浅谈结构体类型
|
10月前
|
编译器 C++
计算结构体大小:内存对齐详解
计算结构体大小:内存对齐详解
181 0
结构体基础
结构体基础
|
编译器 C++
自定义类型之结构体的基础和进阶(有关位段、结构体自引用、嵌套、内存对齐、修改对齐数、结构体的传参、和offsetof宏的使用)
一、结构体基础知识 二、结构体的进阶(有关结构体的自引用,嵌套,内存对齐和内存设计) (一、)首先是结构体的嵌套 (二、)结构体的自引用 (三、)结构体的内存对齐(如何计算结构体的所占内存大小) (四、)如何修改默认对齐数 三、offsetof的意思 四、结构体的传参 五、位段的使用和注意 总结: