快牵着我的袜子

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

为什么要内存对齐?

  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、在堆空间定义的容器变量,变量本身存储在堆区,存储的数据也在堆区;

 

 

如有错误,欢迎指正。

 

posted on 2019-09-19 09:07  快牵着我的袜子  阅读(315)  评论(0编辑  收藏  举报