【问题标题】:Why do I need to use `size_t` in C++?为什么我需要在 C++ 中使用 `size_t`?
【发布时间】:2016-09-06 15:33:47
【问题描述】:

作为初学者,我对size_t 感到非常困惑。我可以使用intfloat 或其他类型。为什么还要声明size_t 类型。我感觉不到它的优点。 看了一些pages,还是看不懂。

【问题讨论】:

  • 更迷惑你的是ptrdiff_t
  • 它可以容纳比 int 更大的数字 标准保证能够容纳与库能够创建的最大可能对象一样大的数字。
  • 这是 C++ 最糟糕的部分之一。
  • @immibis:什么是?那你有你应用一些脑力吗?
  • @LightnessRacesinOrbit 整数类型的激增。类型越多,就越难确保您不会意外地将一种转换为另一种(可能导致溢出)。例如,有人提到list<string>::size_type 可能比size_t 大。

标签: c++ c++11 visual-c++


【解决方案1】:

它的主要优点是它是适合这项工作的工具。

size_t 的字面意思是大到足以代表您平台上任何对象的大小。其他人不是。那么,当你想存储一个对象的大小时,你为什么要使用其他东西

如果你愿意,你可以使用int,但你会故意选择导致错误的次等选项。我不太明白你为什么要这样做,但这是你的代码。

如果您选择使用float,请告诉我们您正在编写什么程序,以便我们避免它。 :)

【讨论】:

  • 补充:一个常见的例子是将索引放入数组std::vector 或类似容器中的函数。 size_t 是保证足够大的类型,可以表达所有可以合法成为此类容器的有效索引的值。
  • 只是为了稍微搅动一下,注意严格来说你应该使用vector<int>::size_type作为向量大小的类型。它不一定必须与std::size_t 相同!尽管为了轻松的生活,请使用auto
  • 哈哈,我可能明白了!谢谢! :)
  • @Bathsheba 严格来说,size_t 不应该在所有平台上都大于或等于vector<T>::size_type,因为vector 是连续的吗?对于非连续容器,我想一些非常奇特的实现和内存架构可能假设允许您保存的对象数量大于最大理论对象的总大小(以字节为单位)...
  • @Johann [C++14: 18.2/6]: size_t 类型是实现定义的无符号整数类型,其大小足以包含任何对象的字节大小。
【解决方案2】:

使用float 会很糟糕,因为这会滥用浮点类型,而且类型提升意味着乘以任何东西的大小都会在浮点中发生!

使用int 也会很糟糕,因为int 的细节是由C++ 标准有意松散定义的。 (它可以小到 16 位)。

size_t 类型可以保证充分表示几乎任何东西的大小,当然表示 C++ 标准库中容器的大小。它的具体细节取决于特定的平台和架构。它是 unsigned 类型的事实是很多争论的主题。 (我个人认为使用unsigned 是错误的,因为它会使用关系运算符混淆代码并引入难以发现的有害错误。

【讨论】:

  • int is intentionally loosely defined by the C++ standard. (It could be as small as 16 bits) 为什么?
  • 我不同意 unsigned = 错误部分。大小的性质是它们不能为负数。使用无符号类型很好地反映了这一点,此外,您不会丢弃数据类型范围的一半(在大小不能为负的情况下)。
  • @vpc 因为它应该代表可以在要运行代码的硬件上最有效地处理的数据类型。和 e。 G。在 16 位处理器上,这将是 16 位数据类型...
  • @KevinZhang:是的,它(类型的范围)可以改变。不,您不能使用它来代替其他任何东西。您为什么要寻找一种万能的解决方案?不存在这样的事情。为手头的工作使用正确的工具。
  • @Aconcagua OTOH,它们遵循模运算的大小的性质吗?
【解决方案3】:

我建议您在想要存储类或结构的大小或处理原始内存时使用 size_t(例如,存储原始内存的大小或用作原始数组的索引)。但是,对于标准容器(例如 std::vector)的索引/迭代,我建议使用给定容器的底层大小类型(例如 vector::size_type)。

【讨论】:

    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 2021-11-29
    • 2021-11-12
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多