2010-10-26 76 views
3

我已经被告知,我应该总是使用size_t总是当我想要32位unsigned int,我不太明白为什么,但我认为这与如果有人在16或64位机上编译程序有关,unsigned int会成为16或64位,但size_t不会,但为什么不呢?以及我如何强制位尺寸正是我想要的?C++:数据类型,要使用哪些?

那么,哪个数据类型的列表在哪里使用?例如,是否有size_t替代unsigned short?或为32bit int?等等。我怎么能确定我的数据类型的位数与我在第一个地方选择的一样多,而不需要担心其他机器上的不同位数?

主要是我更关心的使用,而不是边际速度提升我从内存使用加倍获得的记忆,因为我已经没有太多的RAM。所以我想停止担心如果我的程序编译在不是32位的机器上,一切都会分解。现在我使用size_t总是当我想要它是32位,但short我不知道该怎么做。有人帮我清理了我的头。

在另一方面:如果我需要64位大小可变的,我可以用它在32位机器上的成功?和那个数据类型名称是什么(如果我希望它总是64位)?

回答

1

size_t并不总是32位。例如。它在64位平台上是64位的。

对于固定大小的整数,stdint.h是最好的。但它不会与VS2008或更早版本 - 你必须download it separately。 (它是VS2010和大多数其他编译器的标准部分)。

由于您使用的是VS2008,因此您可以使用特定于MS的,unsigned __int32等类型。文档here

要接听64位的问题:大多数现代编译器有一个64位的,即使是在32位系统。编译器会做一些神奇的工作。对于Microsoft编译器,您只能使用__int64unsigned __int64类型。

+0

'size_t'早在64位之前存在......我应该知道,我在1990年代后期和2000年初的Borland C++编译器中使用它。 – 2010-10-26 12:18:35

+1

[Where is in Visual Studio?](http://stackoverflow.com/questions/1156267/where-is-inttypes-h-in-visual-studio-2005/1156285#1156285) – sbi 2010-10-26 12:19:40

+0

一般来说,我会建议使用''中的类型,因为它们可用于VisualStudio和几乎任何其他C++编译器。 – 2010-10-26 12:23:59

3

size_t用于存储对象大小。它的大小恰到好处,仅用于此目的 - 32位系统上有4个字节,64位系统上有8个字节。您不应该将它与unsigned int或任何其他数据类型混淆。它可能相当于unsigned int或者可能不取决于实现(包括系统位数)。

一旦你需要存储不是一个对象大小以外,你不应该使用size_t,而应该使用一些其他的数据类型。

+0

我也想补充一点'size_t'是由'sizeof'运算符的类型。然而,实际上'size_t'不仅仅是*用于存储对象大小。例如,它被各种标准库函数(如memcpy)用来存储数组长度。 – 2010-10-26 12:21:31

+0

呃,没有memcpy在'unsigned char [N]'上工作?即数组长度和对象大小没有区别。另外,你通常会把一个'sizeof(struct T)'传递给'memcpy',这只有当你把memcpy看作一个对象的大小时才有意义。 – MSalters 2010-10-26 14:08:26

2

补充说明:对于容器,以表明它们的大小,不要使用size_t,使用container<...>::size_type

+2

我不这么认为,除了嵌入式系统编程。对于普通的通用代码来说,它增加了冗长度,降低了清晰度,并且什么也没有获得:-) – 2010-10-26 12:28:56

+0

@Alf:编写通用代码时,这可能很有用,因为您可能不仅需要包含标准容器,而且还需要其他一些与STL兼容的容器,例如,size_type可能无符号短。它确实增加了冗长度,我同意,但我认为这不是一件坏事。虽然显然我应该同意我从不自己写size_type。除非在通用代码中 – 2010-10-26 12:37:23

0

不幸的是,数据类型的性质的怪癖之一是,它取决于你使用哪个编译很大。当然,如果您只编译一个目标,则无需担心 - 只需了解该类型使用的大小是多少即可。

如果需要交叉编译,你可以确保通过定义每个目标自己typedef兼容的操作系统(包围#ifdef块,参照该目标你是交叉编译到)。

如果您曾经担心可以在使用尺寸甚至超过预期尺寸的类型的系统上进行编译,您可以始终使用assert(sizeof(short)==2)或同等版本,以便您可以保证在运行时使用正确尺寸的类型。

您的问题被标记为visual-studio-2008,所以我建议您在该编译器的文档中查找预定义的数据类型。 Microsoft有一个预定义的数字,如​​,DWORDLARGE_INTEGER

查看windef.h winnt.h了解更多信息。

2

size_t不是不是必然是32位。一些编译器已经有16位了。它在64位系统上是64位的。

C++标准通过参考C标准保证long至少为32位。

int仅在形式上保证16位,但实际上我不担心:在16位系统上使用任何普通代码的机会确实很少,在任何32位系统上都是32位位。当然,如果你为一些嵌入式计算机这样的16位系统编码,情况就不一样了。但在这种情况下,您可能会编写特定于系统的代码。

如果您的编译器支持该标头(它是在C99中引入的,并且当前的C++标准源于1998年)或者相应的Boost库标头boost/cstdint.hpp,那么在需要确切尺寸的地方可以使用<stdint.h>

但是,一般情况下,只需使用int即可。 ;-)

干杯&心连心,