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++使用异或运算实现交换两个数的值

    C++使用异或运算实现交换两个数的值

    交换两个数的值,通常用利用一个变量来交换数值,异或交换两个数的值是资源开销最小的方法,不需要中介数,原理简单的来说就是异或的负负得正
    2018-09-09
  • C语言动态内存管理malloc柔性数组示例详解

    C语言动态内存管理malloc柔性数组示例详解

    这篇文章主要为大家介绍了C语言动态内存管理malloc柔性数组示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • C语言实现简单井字棋游戏

    C语言实现简单井字棋游戏

    这篇文章主要为大家详细介绍了C语言实现简单井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • C++报错`Null Pointer Dereference`的解决方法

    C++报错`Null Pointer Dereference`的解决方法

    在软件开发中,Null Pointer Dereference 是一种常见的错误,它发生在程序试图访问或操作一个空指针指向的内存位置时,这种情况通常会导致程序崩溃,给 debug 工作带来很大困扰,今天,我们将探讨如何解决 Null Pointer Dereference 报错,需要的朋友可以参考下
    2024-07-07
  • 浅谈C++11中的几种锁

    浅谈C++11中的几种锁

    本文主要介绍了C++11中的几种锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • OpenCV mask的作用及如何制作掩模mask

    OpenCV mask的作用及如何制作掩模mask

    mask 不是马斯克,是掩膜,可以用来遮盖非感兴趣区,突出感兴趣区,使得图像处理只专注于ROI部分,OpenCV中的很多函数用到mask,mask是什么?怎么制作一个mask?本文给大家分享OpenCV mask的作用及如何制作掩模mask,感兴趣的朋友一起看看吧
    2023-02-02
  • Qt实现简单UDP通信

    Qt实现简单UDP通信

    这篇文章主要为大家详细介绍了Qt实现简单UDP通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Qt实现实时鼠标绘制图形

    Qt实现实时鼠标绘制图形

    这篇文章主要介绍了Qt中QGraphicsView架构下如何实现实时鼠标绘制图形,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试
    2022-02-02
  • 零基础学习C/C++需要注意的地方

    零基础学习C/C++需要注意的地方

    这篇文章主要介绍了零基础学习C/C++需要注意的地方,文中讲解非常细致,供大家参考和学习,想要学习C/C++的可以阅读此文
    2020-06-06
  • C++面试八股文之位运算问题详解

    C++面试八股文之位运算问题详解

    这篇文章主要为大家介绍了C++面试八股文之位运算的问题解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06

最新评论