我被告知,当我想要32位size_t
时,我总是应该使用unsigned int
,我不太明白为什么,但我认为如果有人编译了在16位或64位机器上编程,unsigned int
将变为16位或64位,但size_t
不会,但为什么不呢?以及如何将位大小强制到我想要的位置?
那么,使用哪种数据类型的列表在哪里?何时?例如,size_t
是替代unsigned short
吗?或32位int
?我如何确定我的数据类型具有我在第一时选择的位数,而不需要担心其他机器上的不同位数?
大多数情况下,我更关心所使用的内存,而不是因为内存使用量增加所带来的边际速度提升,因为我的内存不多。因此,如果我的程序是在不是32位的机器上编译的话,我想不要担心一切都会分崩离析。现在我总是使用size_t
,当我希望它是32位时,但对于short
我不知道该怎么做。有人帮我清醒过来。
另一方面:如果我需要64位大小的变量,我可以成功地在32位机器上使用它吗?什么是数据类型名称(如果我希望它总是64位)?
答案 0 :(得分:3)
size_t
用于存储对象大小。它具有完全正确的大小,仅用于此目的 - 32位系统上4个字节,64位系统上8个字节。您不应将其与unsigned int
或任何其他数据类型混淆。它可能等同于unsigned int
或者可能不依赖于实现(包括系统位数)。
一旦您需要存储除对象大小之外的其他内容,则不应使用size_t
,而应使用其他一些数据类型。
答案 1 :(得分:2)
作为旁注:对于容器,要指明其大小,请不要使用size_t
,请使用container<...>::size_type
答案 2 :(得分:2)
boost/cstdint.hpp可用于确保整数具有正确的大小。
答案 3 :(得分:2)
size_t
不不一定是32位。它与一些编译器一直是16位。它在64位系统上是64位。
C ++标准通过参考C标准保证long
至少为32位。
int
只能正式保证16位,但实际上我不担心:在16位系统上使用任何普通代码的可能性确实很小,在任何32位系统上都是如此int
是32位。当然,如果你像一些嵌入式计算机一样编写16位系统,那就不一样了。但在这种情况下,你可能还是在编写特定于系统的代码。
如果你需要精确的大小,你可以使用<stdint.h>
如果你的编译器支持那个标题(它是在C99中引入,当前的C ++标准源于1998),或者相应的Boost库标题{{3} }。
但是,一般情况下,只需使用int
。 ; - )
干杯&amp;第h。,
答案 4 :(得分:1)
size_t
并不总是32位。例如。它在64位平台上是64位。
对于固定大小的整数,stdint.h是最好的。但它不是VS2008或更早版本 - 你必须download it separately。 (它是VS2010和大多数其他编译器的标准部分)。
由于您使用的是VS2008,因此您可以使用特定于MS的__int32
,unsigned __int32
等类型。文档here。
回答64位问题:大多数现代编译器都具有64位类型,即使在32位系统上也是如此。编译器会做一些魔术来使其工作。对于Microsoft编译器,您只需使用__int64
或unsigned __int64
类型。
答案 5 :(得分:0)
不幸的是,数据类型性质的一个怪癖是它在很大程度上依赖于您正在使用的编译器。当然,如果您只编译一个目标,则无需担心 - 只需找出使用sizeof(...)
类型的大小。
如果需要交叉编译,可以通过为每个目标定义自己的typedef
来确保兼容性(包围#ifdef
块,引用您正在交叉编译的目标。)< / p>
如果您担心它可以在使用甚至比您预期的更奇怪的类型的系统上编译,您可以始终assert(sizeof(short)==2)
或等效,以便您可以在运行时保证您'重新使用正确大小的类型。
您的问题标记为visual-studio-2008,因此我建议您查看该编译器的文档以了解预定义的数据类型。 Microsoft具有预定义的数字,例如BYTE
,DWORD
和LARGE_INTEGER
。
查看windef.h winnt.h了解更多信息。