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

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

总结

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

相关文章

  • C++中vector迭代器失效与深浅拷贝问题详析

    C++中vector迭代器失效与深浅拷贝问题详析

    迭代器失效就是迭代器底层对应指针所指向的空间倍销毁了,导致使用了一块已经被释放了的空间,下面这篇文章主要给大家介绍了C++中vector迭代器失效与深浅拷贝问题的相关资料,需要的朋友可以参考下
    2023-01-01
  • 基于QT绘制一个漂亮的预警仪表

    基于QT绘制一个漂亮的预警仪表

    这篇文章主要为大家详细介绍了如何基于QT绘制一个漂亮的预警仪表,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-04-04
  • C++面向对象编程之析构详解

    C++面向对象编程之析构详解

    这篇文章主要为大家详细介绍了C++面向对象编程之析构,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • C++实现KDTree 附完整代码

    C++实现KDTree 附完整代码

    这篇文章主要介绍了C++实现KDTree的代码详解,包括kdTree概念介绍及分割的作用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 深入解读C语言中的符号常量EOF

    深入解读C语言中的符号常量EOF

    这篇文章主要介绍了C语言中的符号常量EOF,文中还介绍了EOF的验证和打印方法,需要的朋友可以参考下
    2015-11-11
  • C++详解Primer文本查询程序的实现

    C++详解Primer文本查询程序的实现

    这个程序还是比较复杂的,把这句话作为文章的开头可以看出它的真实性.....这篇文章主要介绍了文本查询程序的实现,下面我们一起来看看
    2022-06-06
  • 在C语言里单引号和双引号的区别

    在C语言里单引号和双引号的区别

    这篇文章主要介绍了在C语言里单引号和双引号的区别,本文通过代码的实例和注释的详细的说明了单引号和双引号的概念与区别,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 使用C语言实现内存池的示例代码

    使用C语言实现内存池的示例代码

    所谓内存池,顾名思义和线程池的设计原理是一样的,为了减少频繁申请释放内存而带来的资源消耗,减少释放内存后产生的内存碎片,下面我们就来看看如何使用C语言实现内存池吧
    2024-02-02
  • Qt实现解压带有密码的加密文件

    Qt实现解压带有密码的加密文件

    Quazip是Qt平台下面的一个压缩解压缩库。本文将利用Quazip实现解压带有密码的加密文件,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-02-02
  • C++迭代器失效问题及解决

    C++迭代器失效问题及解决

    这篇文章主要介绍了C++迭代器失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02

最新评论