将迭代器条件右操作数从size_t
转换为int
或者迭代可能超过int
的最大值是否更好?答案实施是否具体?
int a;
for (size_t i = 0; i < vect.size(); i++)
{
if (some_func((int)i))
{
a = (int)i;
}
}
int a;
for (int i = 0; i < (int)vect.size(); i++)
{
if (some_func(i))
{
a = i;
}
}
答案 0 :(得分:7)
我几乎总是使用第一个变体,因为我发现大约80%的时间,我发现some_func
也应该使用size_t。
如果实际上some_func
采用了有符号的int,则需要注意当vect大于INT_MAX
时会发生什么。如果解决方案在您的情况下并不明显(通常不是),您至少可以用some_func((int)i)
替换some_func(numeric_cast<int>(i))
(有关numeric_cast的一个实现,请参阅Boost.org)。当vect比你计划的更大时,它具有抛出异常的优点,而不是默默地回绕到负值。
答案 1 :(得分:3)
我只是把它留作size_t
,因为没有充分的理由不这样做。你是什么意思“或者可能迭代到type_t的最大值”?您只是迭代到vect.size()
的值。
答案 2 :(得分:1)
对于大多数编译器来说,它不会有任何区别。在32位系统上,很明显,但即使在64位系统上,这两个变量也可能存储在64位寄存器中,并作为64位值压入堆栈。
如果编译器将 int 值存储为堆栈上的32位值,则第一个函数在CPU周期方面应该更有效。
但差异可以忽略不计(尽管第二个功能“看起来更干净”)