2012-03-10 89 views
7

我想知道为什么这个size_t用于我可以使用说int类型。其表示size_t是返回类型的sizeof运算符。这是什么意思?比如如果我使用sizeof(int)并存储它返回到int类型变量,那么它也可以工作,没有必要将它存储在size_t类型变量中。我只是清楚地想知道使用size_t的基本概念,用一个清楚易懂的例子。感谢任何人都可以解释为什么size_t类型用于例子吗?

+0

您可以使用int来存储sizeof的返回值,这与您有时可以将int 2147483647存储在int中的方式相同。恰恰相反,实现特定的大小正确匹配。 – Lalaland 2012-03-10 23:39:19

+0

另请参阅此问题:http://stackoverflow.com/questions/918787/whats-sizeofsize-t-on-32-bit-vs-the-various-64-bit-data-models – ChrisWue 2012-03-10 23:42:59

+0

任何人都可以确认size_t是相同大小的处理器注册? – arthurprs 2012-03-10 23:44:54

回答

9

size_t保证能够代表最大尺寸可能,int不是。这意味着size_t更便携。

例如,如果int最多只能存储255个字符,但您可以分配5000个字节的数组?显然这不会起作用,但size_t它会。

+1

从技术上讲,int必须至少为16位,它必须至少跨越[-32767..32767]范围。 (为什么不用-32768?为了适应补码和符号 - 幅度系统,以防有人想在旧的Univac机器上使用C,当然这些系统有18位和36位整数,9位“ char)。 – torek 2012-03-11 00:54:49

+0

@torek出于某种原因,我的印象是int只需要C> 16而不是C++。虽然没有检查标准。 – Pubby 2012-03-11 01:10:22

+0

@Pubby:C++从C继承了C++ 1.1 p2 C++是一种基于ISO/IEC 9899:1999中描述的C编程语言的通用编程语言。编程语言 2012-03-11 03:11:56

4

最简单的例子是相当日:一个旧的16比特int系统上的RAM 64 K,一个int的值可以是任何地方从-32768到32767,但之后:

char buf[40960]; 

缓冲区buf占用40千字节,所以sizeof buf太大而不适合int,它需要unsigned int

同样的事情今天能发生,如果您使用的32位int但允许程序在同一时间访问超过4 GB的RAM,因为是所谓的“I32LP64”模型(32位int的情况下,64位long和指针)。这里的size_t类型与unsigned long的范围相同。

0

它是实现定义,但在64位系统上,你会发现size_t往往是64位,而int仍然是32位(除非它是ILP64 or SILP64模型)。

1

您使用的size_t主要用于转换指针到相同的无符号整数大小,对指针进行计算,就好像它们是整数一样,否则会在编译时被阻止。这样的代码旨在在不同指针大小的上下文中正确编译和构建,例如, 32位模型与64位。

相关问题