[C++]深入解析:如何计算C++类或结构体的大小

目录

什么是内存对齐

类的成员的存储规则

怎么进行内存对齐(介绍规则与例子讲解)


什么是内存对齐

内存对齐是指将数据存储在内存中时,按照一定的规则让数据排列在规定的地址上,以提高数据访问的效率和速度。在C++中,结构体(类)内部的每一个成员变量都需要存储到内存中,因此需要进行内存对齐以保证内存的访问效率。 

类的成员的存储规则

成员变量存放在系统分配的对象内存中,成员函数存放在公共的代码段,所以计算类的大小是要计算成员变量(不包括static成员变量,他是存放在全局数据区的)就行,不需要计算成员函数。

怎么进行内存对齐(介绍规则与例子讲解)

1.第一个成员从在与对象偏移量为0的地址处开始存放。

以下面代码为例:

class Student
{
public:
	//...
private:
	char c;
	int i;
};
int main()
{
	class Student s;
	cout << sizeof(s) << endl;
	return 0;
}

第一个成员变量存放位置如图:


2.其他成员变量要对齐到对齐数的整数倍的地址处
 对齐数=编译器默认(或自定义)的一个对齐数与该成员变量的大小(字节)的较小值。
注意:VS中默认的值为8

第二个成员变量存放位置如图:


3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。注意:此最大对齐数不得超过编译器的默认对齐数。

最终结果为:


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

以此代码为例:

class Student
{
public:
	//...
private:
	double d;
};

class person
{
public:
	//...
private:
	char c;
	int i;
	Student s;
};

int main()
{
	class person p;
	cout << sizeof(p) << endl;
	return 0;
}

最终结果为下图:

5.自定义对齐数:#pragma pack (n):n为你想要设置的对齐字节数。

代码和上面(第四点)的代码一样,但将编译器的默认对齐数改为四结果就不一样了

代码:

#pragma pack (2)

class Student
{
public:
	//...
private:
	double d;
};

class person
{
public:
	//...
private:
	char c;
	int i;
	Student s;
};

int main()
{
	class person p;
	cout << sizeof(p) << endl;
	return 0;
}

结果为下图:

相关推荐

  1. C++ 结构

    2024-03-28 05:04:05       49 阅读
  2. C# 结构

    2024-03-28 05:04:05       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-28 05:04:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-28 05:04:05       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-28 05:04:05       82 阅读
  4. Python语言-面向对象

    2024-03-28 05:04:05       91 阅读

热门阅读

  1. 内核态转发平面的SSL加速

    2024-03-28 05:04:05       42 阅读
  2. Spring_MVC

    2024-03-28 05:04:05       40 阅读
  3. BaseDao封装增删改查(超详解!)

    2024-03-28 05:04:05       44 阅读
  4. docker初识

    2024-03-28 05:04:05       47 阅读
  5. RoCE v2中UDP的源端口和目的端口

    2024-03-28 05:04:05       45 阅读
  6. 【QT】QT的事件机制及其与信号机制的区别

    2024-03-28 05:04:05       34 阅读
  7. uniapp 返回上一页再进入当前页mounted不执行

    2024-03-28 05:04:05       46 阅读
  8. TCP/IP:互联网通信的核心协议

    2024-03-28 05:04:05       41 阅读
  9. 老项目接入kafka消费信息另一种方式

    2024-03-28 05:04:05       39 阅读
  10. 记录一次ubuntu网络传输大文件时出现断网现象

    2024-03-28 05:04:05       45 阅读
  11. centos 安装wget

    2024-03-28 05:04:05       36 阅读
  12. 关于对postcss安装和使用比较详细

    2024-03-28 05:04:05       39 阅读