为什么要内存对齐?
1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,对于访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
一、基础数据类型
实验环境:vs2019
基础数据类型的sizeof,包括char、short,int,long,float,double
注意:实际数值有所偏差,与系统相关
C++中float,double到底保留几位有效数字?
float精度是2^23,能保证6位。double精度是2^52,能保证15位。但是默认float和double都只能显示6位,再多需要#include <iomanip>,
然后在输出语句之前插入cout << setprecision(20);强制输出小数位。
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
单精度类型(float)和双精度类型(double)存储
二、数组及字符串
包括字符数组、字符指针、字符串string、整型数组,浮点型数组
三、结构体类型
注:结构体类型的sizeof注意理解内存对齐的概念,可自行搜索了解。
四、类
注:类的sizeof主要是继承问题,哪些继承了,哪些与基类共享,哪些是全局共享。
五、容器
总结:
1、vector、set和map容器其数据都是动态存储在堆空间的内存;
2、在栈区定义容器变量,变量本身存储在栈区,但是变量存储的数据在堆区;
3、在堆空间定义的容器变量,变量本身存储在堆区,存储的数据也在堆区;
如有错误,欢迎指正。
本文来自博客园,作者:快牵着我的袜子,转载请注明原文链接:https://www.cnblogs.com/socks/p/11541016.html