文章目录

  • 0. 注意
  • 1.基本数据类型
  • 2. 指针与引用
    • 2.1指针
    • 2.2 引用
  • 3.构造类型
    • 3.1 struct
    • 3.2 union
    • 3.3 enum
    • 3.4 class

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 c1short 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++各种数据类型所占内存大小相关推荐

  1. Go语言基础数据类型所占内存大小

    基础知识 bit(位):计算机中数据的最小单位,二进制数中的一个数位,0或者1 Byte(字节):计算机中数据的基本单位,每8位(bit)组成一个字节 golang 类型 大小 int8 1字节 in ...

  2. C语言数据类型所占空间大小

    C语言数据类型所占空间大小 /* * datasize.c -- print the size of common data items * This runs with any Linux kern ...

  3. C++_类和结构体所占内存大小,静态成员问题

    C++_类和结构体所占内存大小,静态成员问题 静态成员未初始化或者未调用(当然静态成员必须类外初始化才能调用)是不占内存的.静态成员不占类或结构体的内存 静态成员函数同样只声明未定义同样不占内存 指针 ...

  4. Java计算一个对象所占内存大小_Java程序计算各种对象所占内存的大小的方法

    System.out.println("--- Memory Usage:"); /*打印一行字符串---Memory Usage*/ Runtime rt=Runtime.get ...

  5. 共用体和结构体所占内存大小的计算方法

    共同体作用:让几个不同类型的变量共享同一个内存地址. 共用体所占内存大小:共用体所占内存的大小即公用体中长度最大元素所占用的字节数. #include<stdio.h> typedef u ...

  6. 利用bitmap处理海量数据问题:43亿QQ号所占内存大小为什么是512M?40亿个QQ号如何去重?

    ​参考: 腾讯43亿QQ号码用完后怎么办? 腾讯三面:40亿个QQ号码如何去重 一.背景: 首先,明确两点: QQ号是 unsigned int 类型(4字节无符号整数,共32bit), 也就是说 Q ...

  7. 初识C语言(一)常见变量的含义、所能存储数据的范围、及其所占内存大小。

    一 .变量的类型及其所占内存大小 刚开始学习C语言的时候就会接触到变量的这个概念,变量有很多种类,整型,浮点型等.那么就要了解一下每种类型的变量的含义.能够存储的数据的范围.以及它所占内存的大小. 提 ...

  8. 如何计算变量或数据类型所占内存空间的大小

    内存的储存单元是一个线性地址表,是按字节进行编址的 一个字节可以表示的整数最小为0,最大为255,一个字节等于八个比特,也称二进制位 1B=8b 1KB=1024B 1MB=1024KB 之后更大的依 ...

  9. C语言数据类型占内存大小

    C语言数据类型 使用sizeof计算各数据类型占用内存大小 #include<stdio.h> int main() {typedef struct {int a ;char b;int ...

最新文章

  1. 全局唯一ID生成方案
  2. Linux的load导入语句,LOAD DATA INFILE语句导入数据进入MySQL的一些注意事项
  3. 【JETSON-NANO】SD卡系统备份克隆
  4. 即时通讯音视频开发(三):视频编解码之编码基础
  5. Qt程序单次启动(QSingleApplication类)
  6. (四)boost库之正则表达式regex
  7. mysql too many openfiles解决
  8. 三层架构 android访问MSSQL数据库 程序 (服务器端)
  9. 读书笔记—《销售铁军》随记3
  10. 机器学习(6): 层次聚类 hierarchical clustering
  11. 吴恩达深度学习4.2练习_Convolutional Neural Networks_the Happy House(Keras)
  12. 瘦子的肠道菌群和胖子的区别_胖子和瘦子的终极 PK:比基因?比运动?比肠道细菌!...
  13. 什么是X11-Forwarding
  14. win10系统更新服务器太慢了,Win10系统更新安装慢如何解决
  15. android仿网易云音乐引导页、仿书旗小说Flutter版、ViewPager切换、爆炸菜单、风扇叶片效果等源码...
  16. SpringBoot之加密
  17. 自动作诗器 二逼青年立马变文艺青年~~
  18. 【C4D】所遇问题及解决方法
  19. poj 1264 hdu 1616 SCUD Busters 凸包+面积计算
  20. c语言从键盘输入一个百分制成绩score,C语言程序设计实验实验指导书及答案

热门文章

  1. 模块“DAO350.DLL”可能与你正在运行的windows版本不兼容
  2. 链表之反转链表,万金油的解题方法(java求解)
  3. 解决:Required request body is missing
  4. 独立手机版营销推广落地页pbootcms模板落地页单页网站
  5. 正大国际期货:你身边有朋友或者亲人做期货挣钱的没有?
  6. 图解ReentrantLock底层公平锁和非公平锁实现原理
  7. Java遍历HashSet为什么输出是有序的?
  8. java word加粗_word中选中一行加粗 怎么全文都被加粗了 怎么解决
  9. ABAPDEMOCALLTRANSACTION使用_SAP刘梦_新浪博客
  10. 7.4 小团队、低成本的管理实践之路