[英]Cast from size_t to int, or iterate with size_t?
将iterator条件右操作数从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;
}
}
我几乎总是使用第一个变体,因为我发现大约80%的时间,我发现some_func
应该也可能采用size_t。
如果实际上some_func
采用了signed int,那么你需要知道当vect大于INT_MAX
时会发生什么。 如果解决方案在你的情况下并不明显(通常不是),你至少可以用some_func(numeric_cast<int>(i))
替换some_func((int)i)
some_func(numeric_cast<int>(i))
(参见Boost.org的一个实现) numeric_cast)。 当vect比你计划的更大时,它具有抛出异常的优点,而不是默默地回绕到负值。
我只是将它size_t
,因为没有充分的理由不这样做。 你是什么意思“或者可能迭代到type_t的最大值”? 你只是迭代到vect.size()
的值。
对于大多数编译器来说,它不会有任何区别。 在32位系统上,显而易见,但即使在64位系统上,这两个变量也可能存储在64位寄存器中,并作为64位值在堆栈上推送。
如果编译器将int值存储为堆栈上的32位值,则第一个函数在CPU周期方面应该更有效。
但差异可以忽略不计(虽然第二个功能“看起来”更清洁)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.