C++学习Day04之对象字节数初探

目录


一、程序及输出

1.1 空类字节数

c 复制代码
#include<iostream>
using namespace std;

class Person
{
};

void test01()
{
	//空类的sizeof结果是1  原因  每个对象都应该在内存上有独一无二的地址,因此给空对象分配1个字节空间
	Person p1;
	//  空对象 大小 1  
	cout << "sizeof = " << sizeof(p1) << endl;
}
int main(){
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

输出:

根据C++标准,空类的sizeof结果至少是1。这是因为在C++中,每个对象都应该有一个独一无二的地址,因此即使是空类也应该占据至少一个字节的内存空间。

然而,一些编译器在对空类进行内存对齐时可能会分配更多的内存空间,以便满足特定的对齐要求。例如,一些编译器可能会将空类的sizeof结果设置为4或8,以便将空类的对象对齐到4字节或8字节边界上。

1.2 非空类字节数

c 复制代码
#include<iostream>
using namespace std;

class Person
{
public:

	int m_A; //只有非静态成员变量  属于类对象上

	void func( )//成员函数  并不属于类对象上
	{
		
	}

	static int m_B; //静态成员变量  不属于类对象上

	static void func2()//静态成员函数  不属于类对象上
	{
		
	}
	double m_C;
};
int Person::m_B = 0;
void test01()
{
	Person p1;
	cout << "sizeof = " << sizeof(p1) << endl;
}
int main(){
	test01();
	system("pause");
	return EXIT_SUCCESS;
}

输出:

只有非静态成员变量 属于类对象上

因此:

int 4字节+double8字节=12字节,但是因为大多数编译器的内存对齐规则,最终的字节数是字节对齐的值的倍数,

因此2x8=16字节。

结构体和类的对齐规则通常是其成员中对齐要求最大的那个成员的大小

1.3 设置对齐方式的数值

代码不动,添加一句 #pragma pack(1)

c 复制代码
#include<iostream>
using namespace std;
......
#pragma pack(1)   //设置默认对齐数
class Person
{
public:

	int m_A; //只有非静态成员变量  属于类对象上

	void func( )//成员函数  并不属于类对象上
	{
		
	}

	static int m_B; //静态成员变量  不属于类对象上

	static void func2()//静态成员函数  不属于类对象上
	{
		
	}
	double m_C;
};
........ 省略

此时输出:

12已经是1的倍数。


二、分析与总结

数据成员大小:

C++ 对象的大小取决于其数据成员的大小。基本数据类型(如 char、int、double 等)的大小是固定的,通常是根据平台的架构决定的。结构体和类的大小是其所有成员变量大小的总和。
对齐方式:

编译器为了提高访问内存的效率,通常会要求数据成员按照特定的字节边界对齐。这个字节边界由编译器和平台决定,可以使用 alignof 运算符或 #pragma pack(show) 来查看当前的对齐方式。

相关推荐
茂桑10 分钟前
MVCC(多版本并发控制)
java·开发语言·数据库
thinkMoreAndDoMore1 小时前
深度学习(3)-TensorFlow入门(常数张量和变量)
开发语言·人工智能·python
qing_0406031 小时前
数据结构——二叉搜索树
数据结构·c++·二叉树·二叉搜索树
蓝桉8022 小时前
图片爬取案例
开发语言·数据库·python
逸狼2 小时前
【JavaEE进阶】Spring DI
java·开发语言
日记成书2 小时前
详细介绍嵌入式硬件设计
嵌入式硬件·深度学习·学习
Ljw...2 小时前
DeepSeek+Kimi生成高质量PPT
数据库·c++·powerpoint·ppt·deepseek
敲上瘾2 小时前
基础dp——动态规划
java·数据结构·c++·python·算法·线性回归·动态规划
技术小齐2 小时前
网络运维学习笔记 022 HCIA-Datacom新增知识点03园区网典型组网架构及案例实战
运维·网络·学习
my_styles2 小时前
2025-alibaba-Sentinel组件
java·开发语言·sentinel