我有一个涉及很多递归的C ++代码。我正在考虑为我的变量使用寄存器类。你认为通过这样做我将节省堆栈内存并将提高性能
由于
萨米尔
答案 0 :(得分:8)
我敢打赌编译器不会尊重你的请求。假设您有一个局部变量,并且递归调用该函数100次。如果要尊重所有自动变量'register'关键字,则只需要为该变量设置100个硬件寄存器(所有变量在第100次调用时都是活动的)
性能是一个难题。分析程序在哪里花时间并尝试在那里进行优化,但要谨慎:某些决策可能无法获得收益,有些决策最终会导致性能下降。正如之前提到的,编译器非常擅长他们的工作。强制变量进入寄存器意味着要使用的其余变量少一个寄存器。
答案 1 :(得分:6)
不,我认为它可能根本没有效果。现代编译器在调度寄存器使用方面通常比人类好得多,并且可能会忽略“register”关键字。
话虽如此,找到答案的唯一真正方法是编写一些代码并使用register关键字测量其性能,如果没有它 - 代码更改是微不足道的。
答案 2 :(得分:1)
您可以将算法更改为仅使用std::stack
和一些自定义类,它将包含算法的状态,而不是函数堆栈和递归调用。
答案 3 :(得分:1)
如果我没记错的话,register关键字并不能保证变量会被存储在寄存器中,但是表明它可以并且如果可能的话应该使用寄存器,但是如果寄存器不可用那么它仍然会结束在堆栈上。
Microsoft C ++忽略关键字并自行决定。我首先考虑你的算法以获得性能提升。
答案 4 :(得分:0)
编译器可以100%满足您的register
请求。当然,如果你设法将局部变量或两个局部变量压缩到寄存器中,你可以节省堆栈空间,但是(当然)如果这些值需要在调用中保留,那么它们将需要再次放在堆栈上。