【问题标题】:C++: Datatypes, which to use and when?C++:数据类型,使用哪个以及何时使用?
【发布时间】:2010-10-26 12:10:59
【问题描述】:

有人告诉我,当我想要 32 位 unsigned int 时,我应该始终使用 size_t,我不太明白为什么,但我认为如果有人在 16 或64 位机器,unsigned int 会变成 16 位或 64 位,但 size_t 不会,但为什么不呢?以及如何将位大小强制为我想要的?

那么,使用哪种数据类型以及何时使用的列表在哪里?例如,是否有 size_t 替代 unsigned short?还是 32 位 int?等等。我怎样才能确保我的数据类型有我最初选择的位数,而不需要担心其他机器上的不同位大小?

我更关心使用的内存,而不是我从内存使用量翻倍获得的边际速度提升,因为我没有太多的 RAM。所以我不想再担心如果我的程序是在不是 32 位的机器上编译的,一切都会崩溃。现在我一直使用size_t,当我希望它是 32 位时,但对于short,我不知道该怎么做。有人帮我理清思路。

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

【问题讨论】:

    标签: c++ windows visual-studio-2008


    【解决方案1】:

    size_t 用于存储对象大小。它的大小正好适合这个目的——在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节。您不应将其与 unsigned int 或任何其他数据类型混淆。它可能等同于 unsigned int 或者可能不取决于实现(包括系统位数)。

    一旦您需要存储对象大小以外的内容,则不应使用 size_t,而应使用其他数据类型。

    【讨论】:

    • 我还要补充一点,size_tsizeof 运算符返回的类型。然而,实际上size_t 并非严格用于存储对象大小。例如,各种标准库函数(如memcpy)使用它来存储数组长度。
    • 呃,memcpy 不能在 unsigned char[N] 上工作吗? IE。数组长度和对象大小没有区别。此外,您通常会将sizeof (struct T) 传递给memcpy,这仅在您将memcpy 视为对象大小时才有意义。
    【解决方案2】:

    附带说明:对于容器,要指明它们的大小,不要使用size_t,使用container<...>::size_type

    【讨论】:

    • 我不这么认为,除了嵌入式系统编程。对于普通的通用代码,它增加了冗长,降低了清晰度,并且一无所获。 :-)
    • @Alf:在编写通用代码时,这可能很有用,因为您可能不仅希望包含标准容器,还希望包含其他一些与 STL 兼容的容器,其中 size_type 可能是 unsigned short,例如例子。我同意,它确实增加了冗长,但我不认为这是一件坏事。虽然显然我应该同意我自己从不写 size_type 。除非在通用代码中
    【解决方案3】:

    boost/cstdint.hpp 可用于确保整数大小合适。

    【讨论】:

      【解决方案4】:

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

      C++ 标准通过引用 C 标准保证long 至少为 32 位。

      int 仅正式保证 16 位,但实际上我不会担心:在 16 位系统上使用任何普通代码的机会确实很小,在任何 32 位系统上@987654325 @ 是 32 位的。当然,如果您正在为 16 位系统(如某些嵌入式计算机)进行编码,情况就不同了。但在这种情况下,您可能还是要编写特定于系统的代码。

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

      但是,一般来说,只需使用int。 ;-)

      干杯,

      【讨论】:

        【解决方案5】:

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

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

        由于您使用的是 VS2008,您可以使用 MS 专用的__int32unsigned __int32 等类型。文档here.

        回答 64 位问题:大多数现代编译器都有 64 位类型,即使在 32 位系统上也是如此。编译器会做一些魔法让它工作。对于 Microsoft 编译器,您可以只使用 __int64unsigned __int64 类型。

        【讨论】:

        • size_t 早在 64 位之前就已经存在了...我应该知道,我在 1990 年代末和 2000 年代初的 Borland C++ 编译器中使用了它。
        • 一般来说,我建议使用 <boost/cstdint.hpp> 中的类型,因为它们可用于 VisualStudio 和几乎任何其他 C++ 编译器。
        • @精英绅士:我已经更改了第一段以试图澄清它。我只是以 64 位为例,因为提问者似乎认为 size_t 始终是 32 位。
        【解决方案6】:

        不幸的是,数据类型的特性之一是它在很大程度上取决于您使用的编译器。当然,如果您只为一个目标进行编译,则无需担心 - 只需找出使用 sizeof(...) 的类型有多大。

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

        如果您担心它可能会在使用的类型比您预期的更奇怪的类型的系统上编译,您总是可以assert(sizeof(short)==2) 或等效的,这样您就可以在运行时保证您正在使用大小正确的类型。

        您的问题已标记为 visual-studio-2008,因此我建议您查看该编译器的文档以了解预定义的数据类型。 Microsoft 有一个预定义的数字,例如BYTEDWORDLARGE_INTEGER

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

        【讨论】:

          猜你喜欢
          • 2017-03-04
          • 2011-01-25
          • 1970-01-01
          • 2010-10-10
          • 1970-01-01
          • 2016-10-12
          • 1970-01-01
          • 1970-01-01
          • 2016-08-11
          相关资源
          最近更新 更多