假设你在某些类中有一些函数像这样一起调用
myclass::render(int offset_x, int offset_y)
{
otherClass.render(offset_x, offset_y)
}
这种模式可能会在 10 多个类(class)中重复一段时间,所以我的问题是:
现代 C++ 编译器是否足够聪明,可以识别程序在何处存储函数参数 - 从维基百科告诉我的内容来看,它似乎因参数大小而异,但对于 2 参数函数,处理器寄存器似乎可能 - 不需要被新值覆盖?
如果没有,我可能需要考虑实现我自己的方法
最佳答案
我认为编译器更有可能进行更大规模的优化。您必须检查实际生成的机器代码,例如以下微不足道的尝试:
#include <iostream>
class B {
public:
void F( int x, int y ) {
std::cout << x << ", " << y << std::endl;
}
};
class A {
B b;
public:
void F( int x, int y ) {
b.F( x, y );
}
};
int main() {
A a;
a.F( 32, 64 );
}
使编译器(VS 2010 中的 cl.exe,空项目,原始“发布”配置)生成完全内联调用树的程序集;你基本上得到“推送 40h,推送 20h,调用 std::operator<<。”
滥用 __declspec(noinline)
导致 cl.exe 意识到 A::F 只是转发给 B::F 并且 A::F 的定义只不过是“调用 A::F “根本没有堆栈或寄存器操作(因此在这种情况下,它已经执行了您所询问的优化)。但请注意,我的示例非常人为设计,因此没有说明编译器一般有能力做到这一点,只是说它可以完成。
在您的真实场景中,您必须自己检查反汇编。特别是,如果您对可能影响结果的类成员变量进行任何操作,则需要考虑“this”参数(cl.exe 通常通过 ECX 寄存器传递它)。
关于c++ - 使用参数优化编译器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3779937/