博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
size_t 与 size_type
阅读量:4156 次
发布时间:2019-05-26

本文共 2207 字,大约阅读时间需要 7 分钟。

size_t 与 size_type

问题起源于这样一段代码:

#include 
#include
int main(){ size_t indexs = -1; size_t ps = 100; int index = -1; int p = 100; printf("%d\n", std::min(p, index)); printf("%d\n", std::min(ps, indexs)); return 0;}

其实是很简单的题目,不过要对size_t类型有一个了解才行。

关于size_t的来源:

数据类型"socklen_t"和int应该具有相同的长度。否则就会破坏BSD套接字层的填充.

POSIX开始的时候用的是size_t, Linus Torvalds(他希望有更多的人,但显然不是很多) 努力向他们解释使用size_t是完全错误的,因为在64位结构中 size_t和int的长度是不一样的,而这个参数(也就是accept函数的第三参数)的长度必须和int一致,因为这是BSD套接字接口标准.

最终POSIX的那帮家伙找到了解决的办法,那就是创造了一个新的类型"socklen_t".Linux Torvalds说这是由于他们发现了自己的错误但又不好意思向大家伙儿承认,所以另外创造了一个新的数据类型 。

size_t在C语言中就有了,size_t和ssize_t是ANSI C提供的标准头文件里定义的一个"数据类型",其实并不是新的数据类型,不是关键字,是通过typedef从已有数据类型定义而来。

<cstddef>里这么定义了

#include 
using ::size_tusing::ptrdiff_t

在/usr/lib/gcc/i486-linux-gnu/4.4/include下面

<stddef.h>里面有这么几句:

#ifndef __SIZE_TYPE__#define __SIZE__TYPE__ long unsigned int#endif#if !(defined(__GUNU__) && defined (size_t))typedef __SIZE_TYPE__ size_t;#ifdef __BEOStypedef long ssize_t

size_t是为了方便系统之间的移植而定义的。

  • 在32位系统上定义为 unsigned int
  • 在64位系统上定义为 unsigned long

更准确的说法是:

  • 在32位系统上是32位无符号整型
  • 在64位系统上是64位无符号整型

size_t一般用来表示一种计数,比如有多少东西被拷贝等。

sizeof操作符的结果类型是size_t,

该类型保证能容纳实现所建立的最大对象的字节大小。

它的意义大致是"适于计量内存中可容纳的数据项目的个数的无符号整数类型"。

所以,它在数组下标和内存管理函数之类的地方广泛使用。

而ssize_t这个数据类型用来表示可以被执行读写操作的数据块的大小。它和size_t类似,但必须是signed。

再来看下size_t与size_type的区别:

我觉得有一句话总结的很好:size_t是全局的,而size_type是跟容器相关的

找了下相关的文件:

/c++/4.3/bits/stl_tree.h, stl_list.h, stl_deque.h等直接这么定义了
  • typedef size_t size_type

stl_mutiset.h则这么定义的:
  • typedef typename _Rep_type::size_type size_type;

 

那么size_type到底是一种什么样的类型呢?

string类类型和许多其他库类型都定义了一些配套类型(companion type)。通过这些配套类型,库类型的使用就能与机器无关。size_type就是这些配套类型中的一种。

size_type被定义为与unsigned型(unsigned int, unsigned long)具有相同的含义,而且可以保证足够大能够存储任意string对象的长度。为而来使用由string类型定义的size_type类型。程序员必须加上作用于操作符来说明所使用的size_type类型是由string类定义的。

我们为什么不适用int变量来保存string的size呢?

使用int变量的问题是:有些机器上的int变量的表示范围太小,甚至无法存储实际并不长的string对象。如在有16位int型的机器上,int类型变量最大只能表示32767个字符的string对象。而能容纳一个文件内容的string对象轻易就能超过这个数字,因此,为了避免溢出,保存一个string对象的size的最安全的方法就是使用标准库类型string::size_type().

一点注意:虽然是在学习标准库string的时候巧遇了size_type类型,但是,其实vector库也可以定义size_type类型,在vector库中还有一个difference_type类型,该类型用来存储任何两个迭代器对象间的距离,所以是signed类型的。

最开始的程序结果输出为:-1 100。

转载地址:http://jnkxi.baihongyu.com/

你可能感兴趣的文章
Iptables 指南 1.1.19
查看>>
技术文章如何写作才能有较好的阅读体验
查看>>
国外程序员推荐:每个程序员都应读的书
查看>>
教你如何迅速秒杀99%的海量数据处理面试题
查看>>
给开发维护大型项目开发者的建议
查看>>
table to csv
查看>>
TCP3次握手连接协议和4次握手断开连接协议
查看>>
提高php代码质量 36计
查看>>
助你成为百万富翁的10句箴言
查看>>
了解IO协议栈 ppt
查看>>
Linux系统日志管理
查看>>
真正的美剧字幕组翻译高手教你如何学好英语!心得经验之谈啊有木有
查看>>
如何从代码中消灭大括号和“echo”语句 ... 我刚知道... 原来... 如此...
查看>>
python调试技巧
查看>>
这些年的项目管理心得
查看>>
使用 PHP 直接在共享内存中存储数据集
查看>>
替代netstat ss ip
查看>>
浅谈PHP代码设计结构
查看>>
谁贪占了我的系统资源 php-fpm
查看>>
eAccelerator 配置参数详解
查看>>