C ++:数据types,使用什么时候?

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

那么,哪个数据types的列表在哪里? 例如,是否有一个size_t替代unsigned short ? 或为32位int ? 等等。我怎样才能确定我的数据types有我select的位数,而不需要担心其他机器上的不同位数?

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

另一方面:如果我需要64位大小的variables,我可以在32位机器上成功使用它吗? 这是什么数据types名称(如果我希望它是64位总是)?

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

对于固定大小的整数, stdint.h是最好的。 但是VS2008或更早的版本没有这个功能 – 你必须单独下载它 。 (它是VS2010和大多数其他编译器的标准部分)。

由于您使用VS2008,您可以使用特定于MS的__int32unsigned __int32等类型。 文档在这里 。

回答64位问题:即使在32位系统上,大多数现代编译器都有64位类型。 编译器会做一些神奇的工作。 对于Microsoft编译器,您可以使用__int64unsigned __int64类型。

size_t用于存储对象大小。 它的大小恰到好处,只有这个目的 – 在32位系统上是4个字节,在64位系统上是8个字节。 你不应该把它与unsigned int或其他数据类型混淆。 它可能相当于unsigned int也可能不取决于实现(包括系统位数)。

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

作为一个方面说明:对于容器,要指明它们的大小,不要使用size_t ,使用container<...>::size_type

boost / cstdint.hpp可以用来确定整数有正确的大小。

size_t不一定是32位。 它已经与一些编译器16位。 它在64位系统上是64位的。

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

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

如果你的编译器支持这个头文件(它是在C99中引入的,当前的C ++标准源于1998)或者相应的Boost库头文件boost / cstdint.hpp ,你可以使用<stdint.h>

但是,一般来说,只要使用int 。 😉

干杯&hth。,

不幸的是,数据类型性质的怪癖之一是它很大程度上取决于你使用的编译器。 当然,如果你只编译一个目标,就没有必要担心 – 只要找出sizeof(...)的类型有多大。

如果需要交叉编译,可以通过为每个目标定义自己的typedef (包围#ifdef块,引用要交叉编译的目标)来确保兼容性。

如果你担心它可以在一个系统上编译,这个系统使用的尺寸甚至比你想象的还要小,你总是可以assert(sizeof(short)==2)或者等价的,这样你可以保证在运行时你正在使用正确大小的类型。

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

看看windef.h winnt.h了解更多。