【问题标题】:string::size_type instead of intstring::size_type 而不是 int
【发布时间】:2010-11-13 22:38:31
【问题描述】:
const std::string::size_type cols = greeting.size() + pad * 2 + 2;

为什么是string::size_typeint 应该可以工作!它有数字!!!

【问题讨论】:

    标签: c++ string int size-type


    【解决方案1】:

    空头也持有数字。签名字符也是如此。

    但是这些类型都不能保证足够大来表示任何字符串的大小。

    string::size_type 保证了这一点。它是一种足以表示字符串大小的类型,无论该字符串有多大。

    有关为什么需要这样做的简单示例,请考虑 64 位平台。一个 int 通常仍然是 32 位的,但你有远远超过 2^32 字节的内存。

    因此,如果使用(有符号)int,您将无法创建大于 2^31 个字符的字符串。 然而,在这些平台上 size_type 将是一个 64 位的值,因此它可以毫无问题地表示更大的字符串。

    【讨论】:

    • PowerPC 和 Cell 也是如此。而且,据我所知,在 Alpha 上也是如此。另外,当然,我认为 x64 是当今典型 64 位 CPU。 ;) 但你是对的,它显然是平台相关的。
    • 我们在这里讨论的是哪个 64 位 Linux 平台?在 x64 机器上,我上次尝试时它仍然有 32 位整数。在 Cell 处理器上,int 也是 32 位。通过扩展,我假设同样适用于 PowerPC 上的 Linux。所以不,Linux ABI 因平台而异,而且我所知道的大多数平台都指定 4 位整数,即使在 Linux 上也是如此。
    • 但你是对的。硬件通常定义软件遵循的通用 ABI,以实现互操作性。操作系统定义了一个通常相同但可能不同的 ABI。并且编译器实际上实现了一个 ABI,它通常再次遵循操作系统,但严格来说并不是必须的。
    • 也可以独立于机器。
    【解决方案2】:

    你给出的例子,

    const std::string::size_type cols = greeting.size() + pad * 2 + 2;
    

    来自Accelerated C++ by Koenig。在此之后他还说明了他选择的原因,即:

    std::string 类型将 size_type 定义为 用于保存字符串中字符数的适当类型。每当我们需要本地 要包含字符串大小的变量,我们应该使用 std::string::size_type 作为该变量的类型。

    我们给 cols 一个 std::string::size_type 类型的原因是 确保 cols 能够包含字符数 在问候中,无论这个数字有多大。我们可以简单地 说过 cols 的类型是 int,实际上,这样做可能会 工作。但是,cols 的值取决于输入的大小 我们的程序,我们无法控制输入的时间。 可以想象有人会给我们的程序这么长的字符串 一个 int 不足以包含它的长度。

    【讨论】:

      【解决方案3】:

      嵌套的size_type typedef 是 STL 兼容容器的要求(std::string 恰好是),因此通用代码可以选择正确的整数类型来表示大小。

      在应用程序代码中使用它是没有意义的,size_t 完全可以(int 不是,因为它已签名,并且您会收到已签名/未签名的比较警告)。

      【讨论】:

      • 会说没有意义吗?也许如果您不想要最便携的代码,可以使用size_t。或者对于今天的大多数实际情况,您可以使用size_t。但如果没有意义,size_type 就不会存在了,不是吗?
      • size_t is 保证足够大,所以最多你“浪费”一些空间(在寄存器中或堆栈上)来使用大于-必要的价值。这些 typedef 用于通用代码,而不是在使用 std::string 时,这是一个具体的模型。也就是说,如果您在使用任意basic_string 的模板函数中,尤其是。对于任意的 allocator,您应该使用嵌套的 typedef。但是,是的,std::string 没有意义,因为size_t 完全没问题。
      • size_t 未签名。只要您与std::string::npos(而不是pos >= 0)进行比较,就可以了。
      猜你喜欢
      • 1970-01-01
      • 2017-04-07
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 2021-09-14
      • 2021-12-06
      相关资源
      最近更新 更多