我知道静态强制转换是在编译时处理的,但是在for循环的条件下静态强制转换呢?是否会在每次迭代时进行转换,或者在编译期间只进行一次?我担心这个实现的成本。我知道编译器会自动转换类型,我只是想删除警告。例如:
double limit = 10.0;
for(int i = 0; i < static_cast<int>(limit); i++)
{
...
}
警告是:“从'double'转换为'int'可能会改变其值。”
答案 0 :(得分:1)
double
和int
不是一回事,它们通常需要不同的寄存器,转换通常不是免费的。如果编译器能够证明在循环内没有更改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;
}