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

 更新时间:2023年08月04日 16:21:08   作者:_不会dp不改名_  
这篇文章主要介绍了C++各种数据类型所占内存大小,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

注意

基本数据类型占用数据大小还与系统位数有关,我们假设为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

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

最新评论