C++,最佳实践,int 还是 size_t? [复制]

Posted

技术标签:

【中文标题】C++,最佳实践,int 还是 size_t? [复制]【英文标题】:C++, best practices, int or size_t? [duplicate] 【发布时间】:2011-03-21 10:21:36 【问题描述】:

可能重复:When to use std::size_t?

你好。

假设使用模式相同(即没有负数),更适合用于各种索引,intsize_t 类型?

您在 64 位 Intel 上的体验在两者之间是否存在性能差异?

谢谢

【问题讨论】:

@Cha 谢谢,之前没找到这个帖子。 【参考方案1】:

size_t 是当您使用相对通用 数组时应该用于数组索引的类型。 IE。当您只有一组抽象的chars、ints 或其他东西时。

当您使用 特定 数组时,即包含一些特定于您的应用程序的元素的数组,您通常应该已经有一个“类型选择”来计算或索引在您的应用程序中输入该类型。那是你应该使用的类型。例如,如果某个数组包含公司员工的记录,那么您的程序中应该已经有一个“选择类型”,用于指定“员工数量”。这是您应该用于索引员工记录数组的类型。可能是unsigned int,也可能是employee_count_t 或类似的东西。为此目的使用裸size_t 是设计错误。

另请注意,size_t 不是立即用于数组索引的类型。它是一种旨在表示程序中最大对象大小的类型。它通过传递性对数组“起作用”:数组是对象,因此size_t 总是足以索引数组。但是,当您设计程序时,考虑通用容器 比考虑特定数组 更有意义。今天它可能是一个数组,明天你可能不得不切换到链表或树。一般情况下,size_t 的范围不足以表示抽象容器中的元素数量,这就是为什么size_t 在这种情况下不是一个好的选择。

【讨论】:

@AndreyT,如果明天它可能是一个链表或树,那么任何类型的索引都不好。为此,您需要迭代器。 @Michael Aaron Safyan:不一定。可以构建某种分段数组,索引的概念仍然有意义,并且不受连续内存块的最大大小的限制。 @AndreyT,但链表不支持随机访问......这变得非常骇人听闻,并且性能可能很差。最通用的解决方案是使用迭代器或访问者。索引仅对随机访问容器有意义。 @Michael Aaron Safyan:首先,正如我所说,可以构建一个 random-access 容器,它不受最大连续内存块大小的限制,一些“分段数组”就是一个例子。其次,带有列表的索引的性能是否好取决于上下文。它们对于日常直接访问来说可能太慢了,但它们可能是序列化所必需的。 @Michael Aaron Safyan:首先,将引用序列化为链表的一种(如果不是唯一的)可行方法需要它们进行序列化。指针转换为索引,反之亦然。其次,除了你之外,没有人谈论为此目的制作任何 API 函数(如operator[])。我的观点很简单:在某些情况下使用链表时绝对需要索引,如果做得好,索引链表没有什么低效的。【参考方案2】:

这取决于你在做什么。如果您正在迭代向量,则使用 std::size_t:

for (std::size_t i = 0; i < vec.size(); i++) 
   // do something with vec[i]

但是,请注意以下编码错误:

for (std::size_t i = 99; i >= 0; i--) 
   // This is an infinite loop

如果你只是在做一个循环,由于上述情况,你可能只想使用一个普通的 int。使用 int 和 std::size_t 之间应该没有性能差异。如果您需要精确的大小,则不应使用 int 或 size_t,而应使用 stdint.h 中定义的类型。

【讨论】:

如果您正在迭代 std::vector&lt;&gt;(或任何其他标准容器),您可能希望使用 std::vector&lt;&gt;::size_type 而不是直接快捷方式到 std::size_t @AndreyT,如果担心泛型,那么应该真正使用迭代器。如果要创建一个迭代向量的快速函数,那么从更冗长的 std::vector::size_type 代替 std::size_t 没有任何好处。 我可能在这里遗漏了一些东西,但为什么第二个循环又是无限的? 哦,我刚看到... size_t 未签名。非虚拟机。【参考方案3】:

在您暗示的意义上,类型没有什么不同,通常int 是 32 位,size_t 是平台字的宽度(32-64 位)。我建议您在处理文件、缓冲区以及任何其他可能描述内存区域或缓冲区的内容时使用size_t

此外,您应该注意 int 是有符号的,而 size_t 不是。

最后,int 在历史上被使用,而现在应该使用 size_t。但是,int 本身仍然可以用于其他目的。

【讨论】:

谢谢。我正在尝试在我的项目中对特定类型进行标准化,主要是为了增强接口,同时也消除编译器警告。【参考方案4】:

size_tptrdiff_tint 可能不足以访问数组的所有元素。

【讨论】:

@dan04,int 不太可能不够。更重要的是标准容器使用 size_t,由于 int 是有符号的,而 size_t 是无符号的,你可以得到有符号和无符号类型之间的比较情况。 @Michael Aaron Safyan: 恰恰相反,int 在一般情况下基本上保证是不够的,因为它是 signed 的,即它浪费了一位符号. @AndreyT,理论上是的,但在实践中,你什么时候真的有一个这样大小的数组加载到 RAM 中?如果你有这么多加载到 RAM 中,你的设计可能有问题(你可能应该是流数据并使用迭代器),或者你应该担心类型......但对于几乎所有实际情况,你会正在处理更小的数组。 这是比较苹果和橙子的。如果“int 不够”是问题,您将使用long intsize_tptrdiff_t 传达语义,这就是为什么应该根据上下文使用或不使用它们的原因。 @einpoklum long int 不保证大于int,只能至少一样大。

以上是关于C++,最佳实践,int 还是 size_t? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

size_t和unsigned int区别

创建要在 C# 中编组的 C++ Dll 的最佳实践 [关闭]

Visual C++ 中顺序对话框的最佳实践是啥?

C++实现堆排序

C++实现希尔排序

C++数据类型问题,wchar_t和char;size_t