2011.5.10
《C++ Primer》:C++的内置基本类型在内存中的存储空间依机器而定,C++标准是规定了每个基本类型的最小存储空间,但它并不阻止编译器使用更大的存储空间。 下表是C++标准中的基本类型最小存储空间。
类型 含义 最小存储空间
bool 布尔型 ——
char 字符型 8 bit
wchar_t 宽字符型 16 bit
short 短整型 16 bit
int 整型 16 bit
long 长整型 32 bit
float 单精度浮点型 6位有效数字
double 双精度浮点型 10位有效数字
long double 扩展精度浮点型 10位有效数字
那么什么叫做“C++基本数据类型的存储空间依机器而定”呢?我们首先来了解几个重要的概念:
1、主存储器(内存)
计算机运行C++程序的过程中,基本数据类型的值都暂时存放在主存储器中。主存的物理介质主要采用半导体器件和磁性材料。其中最小的存储单位就是一个双稳态半导体电路或一个CMOS晶体管或磁性材料的存储元 ,它可以存储一个二进制码(0或1)。若干个存储元组成一个存储单元 ,许多存储单元组成了主存储器。
实际上,主存储器的底层只是一些由0和1组成的二进制串,没有任何的结构和意义。
让存储具有结构的最基本方法就是块(chunk)处理存储 。大部分计算机将8个存储元(8 bit)作为一个存储单元(1 byte),每个存储单元分配一个称为地址的数。这样CPU就可以方便的进行寻址和存取数据了。
2、CPU字长、数据总线、地址总线
我们经常说到32位CPU指的是CPU的字长 ,即CPU在单位时间内(同一时间)能一次性处理的二进制数的位数,也可以指CPU寄存器最大位长为32bit。那么CPU执行的每条指令可以处理的数据最大值不能超过32bit,如果要处理64bit的数据就必须分多步处理。
数据总线 用于CPU与存储器或I/O接口之间的数据传输。32位的数据总线指CPU一次指令能够取出的32bit的数据,通常数据总线的宽度与CPU的字长相一致。例如Intel 8086微处理器字长16位,其数据总线宽度也是16位。
地址总线 用于CPU向主存传输地址数据,这个数据就是为主存中每个存储单元分配的地址值。地址总线的位数决定了CPU可直接寻址的内存空间大小,例如Intel 8086的地址总线为20位,其地址可以表示的范围为0——2^20。如果存储器的一个存储单元是8bit(即一个地址有8bit),那么该CPU可以寻址的主存大小不超过2^20*8bit=1M。
理解了这些概念之后,我们来谈谈C++的基本数据类型的存储空间实质上随CPU字长的不同而不同 。
当然,这句话是正确的,但有一点要注意,对于C++的编译器有一个不成文的约定:就是根据机器字长来定义int的长度,最能反映代码的效率。这是为什么呢? 因为字长是CPU在一次处理数据的位数,在32位的CPU上编译C++,整型按32位来存储,自然一次就能处理掉一个整型数据,不用分多步进行,效率自然不一样。
很可惜,这只是个约定,而不是法律。如果C++编译器就是按照自己的标准来定义C++基本数据类型的大小,也并非不可。为此,想要保证程序中的基本数据类型的值不越界,必须了解你所使用的编译器。
基本内置类型的存储空间
最新推荐文章于 2024-01-15 09:39:34 发布