前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >认识 size_t 和指针类型的大小

认识 size_t 和指针类型的大小

作者头像
恋喵大鲤鱼
发布2022-05-09 11:00:55
2.5K0
发布2022-05-09 11:00:55
举报
文章被收录于专栏:C/C++基础C/C++基础

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 来验证。

本机系统类型:

这里写图片描述
这里写图片描述

测试代码:

代码语言:javascript
复制
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类型的定义如下:

代码语言:javascript
复制
#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的编译配置更改如下:

这里写图片描述
这里写图片描述

同样的测试代码:

代码语言:javascript
复制
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的编译配置如下:

这里写图片描述
这里写图片描述

测试代码:

代码语言:javascript
复制
cout<<"sizeof(char*)="<<sizeof(char*)<<endl;

输出结果:

这里写图片描述
这里写图片描述

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

这里写图片描述
这里写图片描述

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.size_t 占用的空间
  • 2.指针的大小
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档