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

相关推荐
艾莉丝努力练剑30 分钟前
【Linux网络】Linux 网络编程入门:TCP Socket 编程(下)
linux·运维·服务器·网络·c++·tcp/ip
宵时待雨33 分钟前
linux笔记归纳4:进程概念
linux·运维·服务器·c++·笔记
星夜夏空9936 分钟前
STM32单片机学习(3)——前置知识学习
stm32·单片机·学习
凯瑟琳.奥古斯特37 分钟前
力扣2760 C++滑动窗口解法
数据结构·c++·算法·leetcode·职场和发展
m0_7381207240 分钟前
渗透测试——Djinn1靶场详细渗透提权过程讲解(绕过黑名单限制,命令执行反弹shell,pyc反编译,代码白盒分析,python沙盒逃逸)
开发语言·python·php
web守墓人1 小时前
【go语言】go语言实现go-torch, 完成Lenet-5的搭建,训练,以及pth和onnx模型导出
开发语言·后端·golang
TEC_INO1 小时前
Linux50:ROCKX+RV1126视频流检测人脸
开发语言·前端·javascript
平凡但不平庸的码农1 小时前
Go 语言常用标准库详解
开发语言·后端·golang
ximu_polaris1 小时前
设计模式(C++)-行为型模式-访问者模式
c++·设计模式·访问者模式
下载居1 小时前
Node.js(Javascript运行环境) 26.1
开发语言·javascript·node.js