认识size_t和指针类型的大小
2015-08-26 10:41
447 查看
1.size_t占用的空间
对于size_t究竟是什么类型,百度百科进行了先关说明。size_t概述: size_t 类型定义在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,使用VS2012来验证。
本机系统类型:
测试代码:
cout<<"sizeof(size_t)="<<sizeof(size_t)<<endl;
输出结果:
疑问解答: 为什么会这样,我之前一直也弄不明白。原来网上说的size_t的大小由系统的位数决定是不准确的。那size_t的大小究竟是由什么决定的呢?
先看一下我刚刚测试代码的VS2012的编译配置。配置如下:
红色框中的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了呢?验证如下:
VS2012的编译配置更改如下:
同样的测试代码:
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位的系统,但是现在(2015年)的CPU基本上都是x86-64的CPU,都支持64位的系统。但是正如上面的讨论,如果编译生成的程序不是64位的,那么指针的大小依然是4个字节。
验证如下:
VS2012的编译配置如下:
测试代码:
cout<<"sizeof(char*)="<<sizeof(char*)<<endl;
输出结果:
更改编译配置,生成64位的程序,我们将得到预想的结果:
参考资料
[1]百度百科.size_t相关文章推荐
- cocos2d-x 3.x 进度条 ProgressTimer
- Android中使用Handler造成内存泄露的分析和解决
- EXPLAIN sql优化方法1 添加索引
- 认识size_t和指针类型的大小
- CSS中display和visibility隐藏元素的区别
- GridView & ListView (Android盒子开发)
- Objective-C Runtime Reference
- FileOutputStream
- 如何根据Correlation ID来查找具体的错误信息
- Highmaps网页图表教程之绘图区显示标签显示数据标签定位
- JavaScript笔记
- 针对java初学者的java接口使用的注意事项
- sql2008安装:无法打开注册表项UNKNOWN\Components\7ABFE44842C12B390AF18C3B9B1A1EE8
- js支持键盘控制的左右切换立体式图片轮播效果代码分享
- 常用的 Android Studio 快捷键:
- mysql笔记
- ex2
- 密码字符串判断是否含特殊字符串
- OpenCv中混合高斯模型的实现
- EXPLAIN sql优化方法3 DERIVED 派生表