内存篇(一):内置类型的机器实现和sizeof
一、内置类型的机器实现
C++内置类型及尺寸:
类型 | 含义 | 最小尺寸 |
---|---|---|
bool | 布尔类型 | 未定义 |
char | 字符 | 8位 |
wchar_t | 宽字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 32位 |
short | 短整型 | 16位 |
int | 整型 | 16位 |
long | 长整型 | 32位 |
long long | 长整型 | 32位 |
float | 单精度浮点数 | 6位有效数字 |
double | 双精度浮点数 | 10位有效数字 |
long double | 扩展精度浮点数 | 10位有效数字 |
- 字节(byte):计算机里可寻址的最小内存块,一般为8位
- 字(word):计算机里存储的基本单元,一般为32位或64位。
-
计算机将每个字节和一个地址关联起来,可以看到相邻字节存放的地址相差1:
image-20200323151535387.png
要给一个对象分配内存,是必须指明其类型的,因为其类型指明了数据所占的比特数以及机器要如何解释这些内容,机器可以以此为依据以对象的内存地址作为起始地址往下读入相应大小的比特数并且依据类型进行解释。
以下是《C++ Primer》里推荐的一些选用类型准则:
- 当明确知道数值不可能为负时,选用无符号类型
- 使用int执行整数运算。实际应用中short常常太小而long有和int一样的尺寸。如果数值超过int的范围就使用long long。
- 浮点数选double,因为float精度经常不够,long double的精度一般没有必要且运行消耗大。
二、sizeof运算符
sizeof
运算符返回一个表达式或者一个类型所占的字节数,下面来看一下它的用法。
sizeof(double); //返回8,,意思是8个字节,即double类型的对象所占空间的大小
double A;
sizeof A; //返回8,A的类型double的对象所占空间的大小
double* p;
sizeof p; //返回4,指针p所占的空间大小
sizeof *p; //返回8,p指向的类型double所占空间大小
-
sizeof
满足右结合律(即一个表达式中存在优先级相同的运算符时,右侧运算符优先与操作数结合),且与*运算符优先级一样,所以表达式sizeof *p
的组合顺序是从右往左,等价于sizeof( *p)
。 - 注意
sizeof
对于数组和指针操作的数组的区别:
double p[10];
sizeof(p); //返回8*10,是整个数组的大小
double *p1 = new double[10];
sizeof(p1);//返回4,是一个指针的大小
尽管p和p1都是一个数组第一个元素的地址,sizeof
返回的内容却并不一样,前者返回数组对象类型占用字节数*数组的元素个数,而后者返回的是一个指针占用的字节数。
网友评论