开发者

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

开发者 https://www.devze.com 2023-11-20 13:33 出处:网络 作者: _不会dp不改名_
目录1.基本数据类型2. 指针与引用2.1指针2.2 引用3.构造类型3.1 struct3.2 union3.3 enum3.4 class总结注意
目录
  • 1.基本数据类型
  • 2. 指针与引用
    • 2.1指针
    • 2.2 引用
  • 3.构造类型
    • 3.1 struct
    • 3.2 union
    • 3.3 enum
    • 3.4 class
  • 总结

    注意

    基本数据类型占用数据大小还与系统位数有关,我们假设为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 www.devze.com<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{
    	phpchar 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("memphpber function3\n");
    		}
    };

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

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

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

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

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

    例如

    class p{
    	public:
    		char c1;
    };

    该类成员对象的大小为1

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

    答案是 是!

    实验一下

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

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

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

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号