【发布时间】:2011-11-18 14:00:40
【问题描述】:
我使用大量用c++ 编写的计算代码,考虑到高性能和低内存开销。它大量使用 STL 容器(主要是 std::vector),并且几乎在每个函数中都对这些容器进行迭代。
迭代代码如下所示:
for (int i = 0; i < things.size(); ++i)
{
// ...
}
但它会产生 signed/unsigned mismatch 警告(Visual Studio 中的 C4018)。
用一些unsigned 类型替换int 是个问题,因为我们经常使用OpenMP pragma,它要求计数器是int。
我即将取消(数百个)警告,但恐怕我错过了一些解决问题的优雅方法。
在迭代器上。我认为迭代器在适当的地方应用时很棒。我正在使用的代码将永远将随机访问容器更改为std::list 或其他东西(因此使用int i 进行迭代已经与容器无关),并且将始终需要当前索引。您需要输入的所有额外代码(迭代器本身和索引)只会使事情复杂化并混淆底层代码的简单性。
【问题讨论】:
-
您能否发布一个示例,其中 OpenMP 杂注会阻止您使用无符号类型?根据this 它应该适用于任何intergal 类型,而不仅仅是
int。 -
我相信这个问题更适合stackoverflow。
-
int和std::vector<T>::size_type的大小和符号也可能不同。例如,在 LLP64 系统(如 64 位 Windows)上,sizeof(int) == 4但sizeof(std::vector<T>::size_type) == 8。
标签: c++ c++ comparison refactoring unsigned signed