"virtual"循环优化中的局部变量声明
Local-variable declaration inside a "virtual" loop optimization
这一次,我找不到我要找的东西(如果我没有搜索正确的东西,那就不知道......)但是,这里是:
在 c++ 中,假设您有一个函数Bar()
,每个周期调用一次......喜欢这个:
class Foo {
public:
void Bar() {
double my_array[3];
// fills the array based on some calculations
double my_array1[3];
// fills the array based on some calculations
double my_array2[3];
// fills the array based on some calculations
_member_of_class = my_array + my_array1 + my_array2; //+ overloaded
}
private:
float _member_of_class[3];
}
int main(int argc, char** argv) {
Foo foo;
while(/*program running*/) {
foo.Bar();
//LOTS of code here
}
return 0;
}
现在,my_arrays是临时数组,作为数据成员并不重要,只是用来填充类成员......显然,调用该函数的开销是不必要的......有没有办法(好吧,我试图避免将它们作为类成员)告诉编译器"节省分配空间"或其他东西,以便减少开销?康斯特会给编译器任何提示吗?我不确定我是否清楚...
无论如何,谢谢!
使用探查器
就目前而言,该函数在类中以内联方式声明。这段代码将进行微不足道的优化,编译器无论如何都可能会将分配排除在循环之外(实际上取决于您遗漏了多少琐碎的东西)。
此外,重载的数组运算符可能会在 gcc 中被矢量化(从 -ftree-vectorize 的 -O3 开始)。看看放的冗长
g++ -O3 -march-native -ftreevectorizer-verbose=2 ...
看看哪些循环被矢量化了,如果没有,为什么不。一定要看看 g++ -S 等的输出。
使用探查器。如果您不知道有必要,请不要"优化"。
将它们作为参数传递给 Bar 函数。数组衰减为指针,并且传递速度非常快。
您可以将数组声明为静态数组。这将强制编译器为它们保留一些内存,而不是在每次调用函数时将它们放在堆栈上。但是,请记住,这会破坏线程安全。
还要记住,堆栈是预先分配的;此代码实际上并没有为数组分配任何新内存,它只是将它们放在已分配的内存中。这里没有开销。编译器只需一条指令即可为所有三个数组保留空间。
为什么不考虑将数组设为私有成员?如果你想保证在运行时堆栈分配中没有开销,使它们成为私有成员,那么其他程序员会清楚地知道这就是正在发生的事情,而编译器切换或依赖于编译器自动完成的优化对其他开发人员来说并不总是显而易见的。
- 在将变量声明为引用时,堆在释放后使用
- 使用的未初始化局部变量'Quick'
- 静态变量声明和定义
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 将变量声明为全局变量,然后声明为局部变量 -Shadowing-
- 尝试声明函数的局部变量,但得到范围错误
- 为什么 C++11 允许您将局部变量声明为 thread_local
- 初学者程序员 c++(局部与全局变量声明)
- 之前声明所有局部变量是否有性能提升或其他原因
- 声明__declspec(裸)的函数如何存储局部变量
- 将局部变量声明为右值引用是没有用的,例如T&& r = move(v)?
- 使用非常量变量声明局部数组来设置长度,这很有效
- 局部变量的声明实际上会重复很多次吗?
- 即使在声明时也使用未初始化的局部变量
- "virtual"循环优化中的局部变量声明
- 在c++中声明一个局部变量const的好处,如果它的值在编译时不知道
- 在类范围内声明与类属性同名的局部变量
- 使用 'new int[n]' 声明新数组时,为什么它没有出现在局部变量列表中?
- 目标 C - 使用局部变量声明的dispatch_apply无法在方法实现中编译C++