考虑以下 C++ 伪代码:
class C {
int a,b,c;
inline void simple_method() { /* whatever */ }
void complex_method();
}
C foo,bar;
int main() {
foo.complex_method();
bar.simple_method();
}
好的。现在生成的汇编代码bar.simple_method()
显然包含对变量 bar.a、bar.b 等的直接引用,即它不会通过对象指针。
然而,非内联方法将通过对象指针访问所有内容。但是由于我正在编写一个嵌入式控制器,它要么具有有限的寻址能力,要么 GCC 不太了解,因此生成的汇编代码真的很慢而且很臃肿。
使用always_inline
生成快速且相当整洁的代码。但由于 complex_method() 有多个调用者,因此这不是一个可行的解决方案。
我想出的解决这个问题的最好方法是拍打always_inline
,X::complex_method()
沿着以下线创建一堆包装器
void _foo_complex_method() { foo.complex_method(); }
然后记住始终使用这些包装器。
如果您有一个类、一个复杂方法和两个全局变量,就像本例中一样,这很容易。问题是我们当前的设计有更多的这些——并且保持所有这些包装器的参数列表和返回值是一个非常令人头疼的问题;此外,我每周都会发现对这些方法的新直接调用。:-/
因此,我想知道是否有一个更简单的习语(可能在有趣复杂的模板和所有 C++ 臭名昭著的东西中实现 ;-) 来完成同样的事情。