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

相关推荐
210Brian13 小时前
STM32学习笔记(五)EXTI外部中断(上)
笔记·stm32·学习
估值探索者13 小时前
【Python实时盯盘与预警 #08】成交额突然放大2倍?Python窗口比较抓异动
java·开发语言·python
辣知13 小时前
辣知·化智19 人类文明的轮回
学习
yk 坤帝13 小时前
用Python实现发送《自动周报》实战脚本
开发语言·python
xian_wwq15 小时前
【学习笔记】RAG 只是 Context Engineering 的一小块-5/16
笔记·学习·rag
abbgogo15 小时前
OSPF动态路由协议
开发语言·php
我不会插花弄玉15 小时前
15.map,set下:AVL树,红黑树和map,set的封装【由浅入深-C++】
c++·stl
123_不打狼15 小时前
零基础到就业:完整计算机视觉系统化学习路线指南
人工智能·学习·计算机视觉
en.en..15 小时前
C 语言嵌入式事件驱动状态机完整教程(枚举配套)
c语言·开发语言
hold?fish:palm15 小时前
20 旋转图像
c++·算法·leetcode