C++各种数据类型所占内存大小

本文详细讲解了C++的基本数据类型(包括char、short、int、long long、float、double和bool),指针与引用的区别,以及struct、union、enum和class的构造特性。特别探讨了结构体的边界对齐规则和不同类型在内存占用上的差异。
摘要由CSDN通过智能技术生成

0. 注意

基本数据类型占用数据大小还与系统位数有关,我们假设为64位的系统

1.基本数据类型

char : 1
short: 2
int: 4
long long: 8
float:4
double:8
bool:1

2. 指针与引用

2.1指针

指针所占的内存空间不随数据类型变化而变化
其实质是地址空间
所以均为8

#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>

using namespace std;

typedef struct _node{
	
	char c1;
	char c2;
	char c3;
long long i1;
}node;

int main(){
	
	int i = 1;
	short t = 12;
	char c ='c';
	long long ll = 521;
	
	node q;
	node *pn = &q;
	int *pi = &i;
	short *pt = &t;
	char *pc = &c;
	
	printf("%d\n",sizeof(pn));
	printf("%d\n",sizeof(pi));
	printf("%d\n",sizeof(pt));
	printf("%d\n",sizeof(pc));

} 

// 8 8 8 8
2.2 引用

引用又叫别名

其所占空间与引用对象所占空间一致

#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
#include <string>

using namespace std;

typedef struct _node{
	
	char c1;
	char c2;
	char c3;
long long i1;
}node;

int main(){
	
	int i = 1;
	short t = 12;
	char c ='c';
	long long ll = 521;
	
	node q;
	node &rn = q;
	int &ri = i;
	short &rt = t;
	char &rc = c;
	
	printf("%d\n",sizeof(rn));
	printf("%d\n",sizeof(ri));
	printf("%d\n",sizeof(rt));
	printf("%d\n",sizeof(rc));
	
	

} 

// 16 4 1 2

3.构造类型

3.1 struct

由于struct有**边界对齐(凑4或8)**的要求

所以尽量将同类型的写一块

类型小的放在最前面

关于边界对齐举几个例子就好说了

类型A1的大小为4

struct p{
	char c1;
	short s1;
}A1;

神奇的是类型A2的大小也为4

但多了一个char类型变量

struct p{
	char c1;
	char c2;
	short s1;
}A2;

如果交换 类型A3的大小为6

struct p{
	char c1;
	short s1;
	char c2;
}A3;

在A1类型 基础上添加一个int 变量成员

类型A4大小为8

struct p{
	char c1
	short s1;
	int  i1; 
}A4;

在A3基础上加一个int 变量成员

A5大小为 12

struct p{
	char c1;
	short s1;
	char c2;
	int i1;
}A5;

这样似乎还不知道怎么算边界对齐的类型大小

考虑类型A6

typedef struct _p{
		
	char c1;	
	char c2;
	char c3;	
}p;

这时候A6 的大小为3

说明了边界对齐只发生在有不同数据类型

在A6 基础上加一个int类型数据得到** A7**

大小为 8

typedef struct _p{
		
	char c1;	
	char c2;
	char c3;
	int i1;	
}p;

如果A6上加上个long long 类型数据呢

A8大小为 16

typedef struct _p{
		
	char c1;	
	char c2;
	char c3;
	long long ll1;	
}p;

总结

当变量中不存在8字节的变量时(不足4补充成4的倍数)
总是向4字节对齐(多个变量)
出现的话就8字节对齐

3.2 union

这个不用说,直接取里面成员需要的最大空间

共用体u所用空间 4

union p{
	char c1;
	short s1;
	char c2;
	int i1;
}u;
3.3 enum

枚举变量可以当作一个int
占用4B

enum _color{
	red = 1,
	yellow = 2,
	blue = 3
}Color;

3.4 class

一个空类占多少字节呢?

输出结果为1

class p{
	
};

int main(){
	
	printf("%d\n", sizeof(p));
} 

给它加上一个自定义的成员函数

class p{
	public:
		void pint(void){
			printf("member function\n");
		}
	
};

答案还是1,那是不是加的不够多?

class p{
	public:
		void pint(void){
			printf("member function\n");
		}
		void pint1(void){
			printf("member function1\n");
		}
		void pint2(void){
			printf("member function2\n");
		}
		void pint3(void){
			printf("member function3\n");
		}
};

经过几次实验,类大小似乎与类的成员函数无关

可以猜测一下,一个类的对象只是将成员函数放在

类的相关位置,每个对象调用只是取这个类的位置然后调用成员函数

成员函数并不占用对象空间,所以

类的大小只取决于定义的数据类型的大小

例如

class p{
	public:
		char c1;
};

该类成员对象的大小为1

类会有边界对齐的规则吗?

答案是 是!

实验一下

class p{
	public:
		char c1;	
		long long ll1;
		int t2;
};

这个类(所产生对象)的大小为 24

所以类(对象)的大小相当于把它看成结构体的大小

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值