从size_t转换为int,或者用size_t迭代?

时间:2009-08-12 18:33:26

标签: c++

将迭代器条件右操作数从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;
    }
}

3 个答案:

答案 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周期方面应该更有效。

但差异可以忽略不计(尽管第二个功能“看起来更干净”)