当我编写包装类时,很多方法都采用以下形式:
class Wrapper{
public:
vec3 getPos(){ return m_position.get(); }
void setPos(vec3 pos){ m_position.set(pos); }
private:
ThingGettingWrapped m_position;
}
}
不过我很好奇,getPos()
和 setPos()
是否会产生开销,或者现代编译器是否足够智能以优化委托(delegate),所以 wrapper. set/get()
等同于wrapper.m_thingWrapped.set/get()
?
(我知道我的示例中的方法是内联的,但假设它们没有明确内联和单独定义)
最佳答案
优化器可以扩展内联调用,在这种情况下,额外调用没有开销。
如果调用未内联扩展,那么像这样的包装器可能会产生开销。
现代编译器的优化器进行内联扩展。
assume they are not explicitly inlined and defined separately
将(小)开销,除非优化器可以扩展内联调用。您可以通过在定义它的同一翻译单元中调用该函数来保证内联的能力。定义内联函数 - 就像您在示例中所做的那样 - 为所有翻译单元启用并强制执行此操作,因为在所有翻译单元中都定义了内联函数。允许跨翻译单元内联扩展的另一种方法是 LTO .
一个函数不需要是内联的就可以内联扩展,优化器也不需要内联扩展所有对内联函数的调用。内联函数将始终可内联扩展。非内联函数在某些情况下可能是可扩展的,但并非总是如此。
关于C++:对微不足道的包装方法进行优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532600/