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?
你好。
假设使用模式相同(即没有负数),更适合用于各种索引,int
或 size_t
类型?
您在 64 位 Intel 上的体验在两者之间是否存在性能差异?
谢谢
【问题讨论】:
@Cha 谢谢,之前没找到这个帖子。 【参考方案1】:size_t
是当您使用相对通用 数组时应该用于数组索引的类型。 IE。当您只有一组抽象的char
s、int
s 或其他东西时。
当您使用 特定 数组时,即包含一些特定于您的应用程序的元素的数组,您通常应该已经有一个“类型选择”来计算或索引在您的应用程序中输入该类型。那是你应该使用的类型。例如,如果某个数组包含公司员工的记录,那么您的程序中应该已经有一个“选择类型”,用于指定“员工数量”。这是您应该用于索引员工记录数组的类型。可能是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<>
(或任何其他标准容器),您可能希望使用 std::vector<>::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_t
或 ptrdiff_t
。 int
可能不足以访问数组的所有元素。
【讨论】:
@dan04,int 不太可能不够。更重要的是标准容器使用 size_t,由于 int 是有符号的,而 size_t 是无符号的,你可以得到有符号和无符号类型之间的比较情况。 @Michael Aaron Safyan: 恰恰相反,int
在一般情况下基本上保证是不够的,因为它是 signed 的,即它浪费了一位符号.
@AndreyT,理论上是的,但在实践中,你什么时候真的有一个这样大小的数组加载到 RAM 中?如果你有这么多加载到 RAM 中,你的设计可能有问题(你可能应该是流数据并使用迭代器),或者你应该担心类型......但对于几乎所有实际情况,你会正在处理更小的数组。
这是比较苹果和橙子的。如果“int
不够”是问题,您将使用long int
。 size_t
和 ptrdiff_t
传达语义,这就是为什么应该根据上下文使用或不使用它们的原因。
@einpoklum long int
不保证大于int
,只能至少一样大。以上是关于C++,最佳实践,int 还是 size_t? [复制]的主要内容,如果未能解决你的问题,请参考以下文章