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) 来查看当前的对齐方式。

相关推荐
我不会编程55519 小时前
Python Cookbook-5.1 对字典排序
开发语言·数据结构·python
李少兄20 小时前
Unirest:优雅的Java HTTP客户端库
java·开发语言·http
云上艺旅20 小时前
K8S学习之基础七十四:部署在线书店bookinfo
学习·云原生·容器·kubernetes
懒羊羊大王&20 小时前
模版进阶(沉淀中)
c++
无名之逆20 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
你觉得20520 小时前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义下载方法
大数据·人工智能·python·gpt·学习·机器学习·aigc
似水এ᭄往昔20 小时前
【C语言】文件操作
c语言·开发语言
啊喜拔牙20 小时前
1. hadoop 集群的常用命令
java·大数据·开发语言·python·scala
owde20 小时前
顺序容器 -list双向链表
数据结构·c++·链表·list
xixixin_20 小时前
为什么 js 对象中引用本地图片需要写 require 或 import
开发语言·前端·javascript