c++ uint , unsigned int , int

39

嗨,我有一个涉及向量和这些向量元素索引的程序,我想知道:

  1. uintunsigned int 之间有什么区别?
  2. 使用上述类型中的哪一个更好,还是只使用 int,因为我读到一些人说编译器会更有效地处理int值,但如果我使用 int,我将不得不始终检查负索引,这很麻烦。
  3. 您认为迭代器更好吗?它是否比正常索引 vectorx[idx] 更高效?

p.s 软件将处理大量数据过程,并且良好的性能是必须具备的要求。

4个回答

56
  1. C++没有定义uint类型。这必须是“您”的类型,即在您的代码或某个第三方库中定义的类型。可以猜测它与unsigned int相同。但也可能是unsigned long int或其他类型。无论如何,您都需要自行检查。

  2. 这是个人风格问题。例如,我认为必须使用无符号类型来表示自然非负值,如大小或数量。除了一些特定上下文之外,有符号类型和无符号类型之间没有性能差异。我会说,在大多数情况下,处理无符号类型会更有效率。

  3. 迭代器使实现更加通用,即您可以使用顺序访问迭代器,从而使您的实现适用于任何顺序数据结构。通过使用索引,您将在数据结构上强制执行随机访问要求,这是一个强要求。当没有真正需要时,强制执行强要求不是一个好主意。


1
@AndreyT:我不知道,但我正在使用NetBeans、GCC编译器,并且我已经使用uint编写了代码,而且没有使用任何库也可以正常工作。第2和第3点非常有用,非常感谢 :) - Ismail Marmoush
42
大多数编译器将 uint 定义为 unsigned int 的速记方式。 - You
3
无论如何,这都无法改变一个事实:在C和C++中都没有uint这种类型,因此除非考虑特定的编译器,否则有关uint的问题是没有意义的答案。 - AnT stands with Russia
1
@AndreyT,我还要补充一点,当处理容器大小时,不应使用unsigned intunsigned long。至少在C++中,因为问题已经被标记,你应该使用size_t - Nathan Ernst
9
不正确。你说的是一般情况下的容器,对吗?在一般情况下,您不应该使用size_t。并不能保证size_t的范围足以满足任何容器。只有基于数组的容器才能使用size_t,其他容器则不行。另外,在处理标准容器时,应该使用container_type::size_type而不是size_t - AnT stands with Russia
显示剩余6条评论

3
如果您按顺序遍历向量,那么请使用迭代器。无论索引类型如何,与索引相关的开销都可以通过迭代来避免。

3

1) uint = 无符号整数,实际上uint只是unsigned int的一个typedef(在编译时将被unsigned int替换)。

2) 如果您想向代码添加一些“安全性”,请使用uint,您肯定会避免负值。

3) 如果您按顺序运行向量,请使用迭代器,它们针对顺序循环进行了优化(它们是某种指针)。


4
不至于被踩,但 uint 通常是一个 typedef 而不是宏定义。有符号和无符号与安全性关系不大(实际上可能会导致安全漏洞,因为无符号算术的运算规则与许多程序员的预期不同!)。 - Tyler McHenry
你的typedef没错(我会修改它)。所谓安全,是指程序员的安全感,与编译器无关,这就是我用引号的原因。 - Arslan

0

正如其他帖子所指出的那样,uint 可能是 unsigned int 的 typedef。 如果您正在使用 Visual Studio,则可以在文本光标位于 uint 时按下 F12 快速检查该事实以查看其定义。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接