1.size_t 占用的空间

size_t 概述: size_t 类型定义在 C++ 中的 cstddef 头文件中,该头文件文件是 C 标准库的头文件 stddef.h 的 C++ 版。它是一个与机器相关的 unsigned 整型类型,其大小足以保证存储内存中对象的大小。

size_t 由来:在 C++ 中,设计 size_t 是为了适应多个平台的 ,size_t 的引入增强了程序在不同平台上的可移植性。

size_t 大小:关于 size_t 占用的空间百度百科的描述是:经测试发现,在 32 位系统中 size_t 是 4 字节的,而在 64 位系统中,size_t 是 8 字节的,这样利用该类型可以增强程序的可移植性。

疑问:上面的描述看似很有道理,但是很多人在测试的时候发现,为什么测试环境明明是 64 位的系统,sizeof(size_t) 的值却等于 4 呢?而不是原本预期的 8。

本机环境是 Win7 64bits,使用 VS2017 来验证。

本机系统类型:

测试代码:

cout<<"sizeof(size_t)="<<sizeof(size_t)<<endl;

输出结果:

疑问解答: 为什么会这样,我之前一直也弄不明白。原来网上说的size_t的大小由系统的位数决定是不准确的。那size_t的大小究竟是由什么决定的呢?

先看一下我刚刚测试代码的VS2017的编译配置。配置如下:


红色框中的Win32表示的是什么意思呢?原来Win32表示生成的程序是32bits。32bits的程序既可以在Windows 32bits的系统下运行,也可以在Windows 64bits的系统下运行。所以,我们配置生成的程序是32bits的,因此size_t就是unsigned int类型,大小为4个字节。

VC++中关于size_t类型的定义如下:

#ifdef  _WIN64
typedef unsigned __int64    size_t;
#else
typedef _W64 unsigned int   size_t;
#endif

其大概的意思就是size_t要么是unsigned int,要么是unsigned long int,那么按照上面的推理,修改编译选项为x64,生成64bits的程序,size_t的类型是不是就变成了unsigned long int了呢?我们来验证一下。

VS2017的编译配置更改如下:

同样的测试代码:

cout<<"sizeof(size_t)="<<sizeof(size_t)<<endl;

输出结果为:

正如预期的一样,size_t变成了unsigned long int ,占用8字节的内存空间。

总结:size_t的大小并非像很多网上描述的那样,其大小是由系统的位数决定的。size_t的大小是由你生成的程序类型决定的,只是生成的程序类型与系统的类型有一定关系。32bits的程序既可以在64bits的系统上运行,也可以在32bits的系统上运行。但是64bits的程序只能在64bits的系统上运行。然而我们编译的程序一般是32bits的,因此size_t的大小也就变成了4个字节。

2.指针的大小

指针用于存放地址,其大小有机器字长决定,如果是32位机器就是4字节的,如果是64位机器就是8字节的。这里的32位机器和64位机器指的是什么呢?CPU的架构决定了机器的类型,如果CPU是x86架构,那么就是32位的CPU,当然并非所有的x86架构的CPU都是32位的,比如intel的8086和8088就是16位的CPU。如果CPU是x86-64的架构,那么就是64位的CPU。CPU的位数是由其字长决定,字长表示CPU在同一时间中能够处理二进制数的位数叫字长。字长是由CPU中寄存器的位数决定的,并非由数据总线的宽度决定的,只是数据总线的宽度一般与CPU的位数相一致。

系统的位数依赖于CPU的位数,即32位的CPU不能装64位的系统,但是现在(2018年)的CPU基本上都是x86-64的CPU,都支持64位的系统。正如上面的讨论,如果编译生成的程序不是64位的,那么指针的大小依然是4个字节。

验证如下:

VS2017的编译配置如下:

测试代码:

cout<<"sizeof(char*)="<<sizeof(char*)<<endl;

输出结果:

更改编译配置,生成64位的程序,我们将得到预想的结果:


参考资料

[1] 百度百科.size_t

认识 size_t 和指针类型的大小相关推荐

  1. c语言指针变量字节,C语言指针变量类型和大小

    指针变量作为C语言中的特殊数据类型,除了用于存储内存地址之外,它与其他类型比较是否具有其他特点呢?接下来对指针类型进行分析,剖析指针类型的特点. 指针的大小与其指向的内存中存储的变量类型无关,它只与计 ...

  2. C语言学习之用函数处理,而且用指针类型的数据作函数参数,对输入的两个整数按大小顺序输出

    对输入的两个整数按大小顺序输出.用函数处理,而且用指针类型的数据作函数参数. int main(){void swap(int *p1,int *p2);//声明swap函数 int a,b;int ...

  3. C++中void和void*指针的含义 (指针类型的含义)

    转载自:http://blog.csdn.net/lee_shuai 指针有两个属性:指向变量/对象的地址和长度,但是指针只存储地址,长度则取决于指针的类型:编译器根据指针的类型从指针指向的地址向后寻 ...

  4. C语言中的void 和void 指针类型

    C语言中的void 和void 指针类型 C语言, void, void指针 许多初学者对C中的void 和void 的指针类型不是很了解.因此常常在使用上出现一些错误,本文将告诉大家关于void 和 ...

  5. 深入探究指针及指针类型

    目录 前言 1. 字符指针 2. 数组指针 2.1 数组指针的定义 2.2 & 数组名 VS 数组名 2.3 数组指针的应用 3. 数组传参和指针传参 3.1 一维数组传参 3.2 二维数组传 ...

  6. c语言中指针的类型,学习C语言中的指针类型

    摘要:结合我院学生十年来参加全国计算机等级考试(C语言部分)情况,通过分析成绩分布与题型关系,我们发现指针方面的题型失分率最高.在此基础上结合教学实际,本文提出学习指针知识的方法和顺序过程,并将其应用 ...

  7. C语言数组类型、数组指针类型、数组指针类型变量

    C语言数组类型.数组指针类型.数组指针类型变量 数组类型 数组指针类型 数组指针用于指向一个数组 数组指针:用数组类型加*定义一个数组指针 数组指针:定义一个数组指针类型,然后用类型定义变量 数组指针 ...

  8. 一维数组,二维数组,三维数组,数组与指针,结构体数组,通过改变指针类型改变访问数组的方式

     打印数组中的每个元素,打印每个元素的地址: #include <stdio.h> #include <stdlib.h> void main(void) { int a[ ...

  9. C语言创建指针需要给大小吗,如何用c语言创建一个指针(示例代码)

    正如我们所知,在c语言中,char指针逐字节遍历内存,即每次1字节,每次整数指针4字节(在gcc编译器中),每次2字节(在TC编译器中). 例如: char *cptr; // if this poi ...

最新文章

  1. 机器学习中的三对性能度量参数
  2. Core禁用BIP70或只为制造闪电网络硬需求
  3. [JSP]解决Maven创建项目失败
  4. php多图上传插件ios,yii2组件之多图上传插件FileInput的详细使用
  5. 关于intel 32 hex文件格式以及hex2rom.sed
  6. 数据库流行度7月排行榜:Oracle 和 MySQL 暴跌创历史新低
  7. javascript 理解对象--- 定义多个属性和读取属性的特性
  8. 计算机基础教学模式,计算机应用基础 2018 [基于能力本位的“计算机应用基础”教学模式初探]...
  9. 关于nagios 邮件报警问题
  10. r语言列表添加元素_技术贴 | R语言:geom_smooth在散点图中添加多条回归直线
  11. 家庭农场海边作弊工具的Andr​​oid的ios
  12. 胜利vs50线跟vs100线区别_BV线与BVR电线的区别
  13. 人工智能轨道交通行业周刊-第43期(2023.4.24-5.7)
  14. node 热更新代码,无需每次重启命令
  15. Systemd基础篇:4:对服务启动出现的问题进行debug的方法
  16. css3的弹性盒子模型,css3弹性盒子模型——回顾。
  17. iOS JS与OC交互
  18. Linux Deepin蓝牙更新内核后无法使用的问题的各种方法尝试-service\heitool\hciconfig\blueman
  19. 聊聊Raft的性能优化
  20. Apple Developer:苹果客服中心电话

热门文章

  1. 奔驰车载逻辑单元 (OLU) 源代码遭泄露
  2. 五年来,开源论坛软件MyBB共修复100多个漏洞
  3. 利用Geotools来转换影像的坐标系[转]
  4. 【Java定时任务调度工具】Timer
  5. Linux中zip和tar处理软链接的差异与选择
  6. NodeJS学习第一季-路由规则
  7. 突破”子网隔离”***C段
  8. NSD cisco高级路由与交换技术--2014.8.16
  9. htpasswd用法
  10. javascript js 拖动效果 兼 ie 6,7,8 firefox Chrome(原创,想要尽管拿去用。技术支持:QQ3084532)...