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

相关推荐
远望清一色9 分钟前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself19 分钟前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
凌云行者28 分钟前
OpenGL入门005——使用Shader类管理着色器
c++·cmake·opengl
XiaoLeisj30 分钟前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
凌云行者32 分钟前
OpenGL入门006——着色器在纹理混合中的应用
c++·cmake·opengl
杜杜的man34 分钟前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*35 分钟前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
半桶水专家35 分钟前
go语言中package详解
开发语言·golang·xcode
llllinuuu36 分钟前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s37 分钟前
Golang--协程和管道
开发语言·后端·golang