C++中是否应始终避免变量声明
Should variable declarations always be avoided in C++?
为了清晰起见,有时我会在代码中声明"一次性"变量。这会显著影响性能吗?或者编译器可以对其进行优化吗?
例如,我倾向于这样做:
int minVal = long_arithmetic_expresion();
int maxVal = even_longer_expression();
for (int i = minVal; i < maxVal; i++)
{
// Do stuff not related to minVal or maxVal
}
double part1 = 4*sqrt(something)* ... // Very long thing
double part2 = 5*sqrt(something else)* ... // Very long thing
double interestingValue = part1 / part2; // This is the only interesting variable for later
而不是:
for (int i = long_arithmetic_expresion(); i < even_longer_expression(); i++)
{
// Do stuff not related to minVal or maxVal
}
double interestingValue = (4*sqrt(whatever)* ...) / (5*sqrt(something else)* ...);
这个for循环将包含在一个将被多次调用的函数中,因此在我的情况下,即使是很小的性能增益也将是相关的。
注意:
正如人们很快指出的那样,在循环的每一步都有可能对even_langer_expression()进行求值,这当然是不好的。为了清楚起见,我的问题与声明一个使用变量的事实有关。我在循环之后添加了更多的代码。我指的是变量第1部分和的第2部分。
这会显著影响性能吗?或者编译器可以对其进行优化吗?
完全取决于:
如果long_arithmetic_expresion()
和even_longer_expression()
标记为constexpr
,并且在运行时不太可能更改,则编译器可以优化对这些函数的重复调用。
否则,最好使用一次初始化的变量。
除非禁用优化,否则以下代码在现代编译器上几乎肯定会显示出完全相同的性能(考虑到表达式显然是独立的):
// save to temporary minVal variable
int minVal = long_arithmetic_expresion();
int maxVal = even_longer_expression();
for (int i = minVal; i < maxVal; i++) {
...
}
// avoid creating temporary minVal variable
int maxVal = even_longer_expression();
for (int i = long_arithmetic_expresion(); i < maxVal; i++) {
...
}
但第一个版本通常更可读=)
原因是:对于编译器来说,基本类型变量的复制传播是微不足道的。因此,在第一个版本中,编译器将删除i = minVal
赋值。
相关文章:
- 在将变量声明为引用时,堆在释放后使用
- 静态变量声明和定义
- 在变量声明中使用 for 循环
- 向量索引变量声明(size_t 或 std::vector<DATATYPE>::size_type)
- C++ 类型类的变量声明不命名类型?
- 将本地 OpenCV Mat 变量声明为静态以防止重新分配
- std::enable_if 更改成员 *变量* 声明/类型
- 在C++中,变量声明左侧的大括号是什么意思?
- 将变量声明为全局变量,然后声明为局部变量 -Shadowing-
- 命名空间内C++变量声明
- 将静态全局变量声明为内联有什么意义吗?
- 如何将一个变量声明为另一个变量的值
- 如何将迭代器变量声明为私有成员变量
- 没有变量声明为函数,但错误:二进制表达式的操作数无效
- 有没有人有书面证据来保证函数中参数的定义方式与普通变量声明相同?
- ClangTool 如何获取变量声明中模板参数的位置?
- 标准与显式自动推导变量声明
- C 静态变量声明怪异链接器错误
- 如何为数组成员变量声明 getter/setter
- 可视C++变量声明