for循环中的static_cast

时间:2014-07-08 16:13:36

标签: c++ for-loop compilation static-cast

我知道静态强制转换是在编译时处理的,但是在for循环的条件下静态强制转换呢?是否会在每次迭代时进行转换,或者在编译期间只进行一次?我担心这个实现的成本。我知道编译器会自动转换类型,我只是想删除警告。例如:

double limit = 10.0;

for(int i = 0; i < static_cast<int>(limit); i++)
{
   ...
}

警告是:“从'double'转换为'int'可能会改变其值。”

2 个答案:

答案 0 :(得分:1)

doubleint不是一回事,它们通常需要不同的寄存器,转换通常不是免费的。如果编译器能够证明在循环内没有更改limit,它可以减少在循环开始时执行一次的转换。如果编译器可以证明limit等于10.0,则静态强制转换可能在编译时被10替换。

答案 1 :(得分:0)

这取决于您的“...”代码。


对于此代码,limit在编译时是已知的。

您的编译器可以断定它可以在编译时执行static_cast 一次。您的编译器 同事也可能想知道为什么您没有制作limit const 。或者为什么它是double开头。

double limit = 10.0;

for(int i = 0; i < static_cast<int>(limit); i++)
{
   std::cout << i;
}

对于此代码,在编译时不知道limit

您的编译器必须在运行时执行static_cast 每个循环。您的编译器也可能想知道为什么您没有制作limit const

double limit = 10.0;

for(int i = 0; i < static_cast<int>(limit); i++)
{
   std::cin >> limit;
}