在C ++类中,使用静态函数而不是成员函数会产生任何开销。
class CExample
{
public:
int foo( int a, int b) {
return a + b ;
}
static int bar( int a, int b) {
return a + b ;
}
};
我的问题是;
答案 0 :(得分:9)
在这个例子中foo()或bar()更有效吗?
没有。两个呼叫都是静态解决的。将this
指针传递给非static
函数可能会有一些开销,但在这种情况下,两者都可能会内联。
为什么我不想让foo()进入静态函数,因为它不会改变任何成员变量?
你不会,所有方法都没有绑定到实例static
。
答案 1 :(得分:5)
这个答案集中讨论你问题的第二部分 引自C ++编码标准:101规则,指南和最佳实践:
第44章。更喜欢写非会员非友好职能 [...]非成员非友好函数通过最小化依赖[...]
来改进封装
Scott Meyers提出了以下算法来确定哪些方法应该是一个类的成员(source)
if (f needs to be virtual)
make f a member function of C;
else if (f is operator>> or operator<<)
{
make f a non-member function;
if (f needs access to non-public members of C)
make f a friend of C;
}
else if (f needs type conversions on its left-most argument)
{
make f a non-member function;
if (f needs access to non-public members of C)
make f a friend of C;
}
else if (f can be implemented via C's public interface)
make f a non-member function;
else
make f a member function of C;
至于问题的前半部分,我猜测编译器会优化任何差异。
答案 2 :(得分:1)
bar在某些编译器/情境中可能会减少开销,因为它永远不需要放在指针表中,也不需要额外的“this”参数。
如果不使用本地成员,使foo成为非静态的唯一原因是如果你打算超载它,但因为它不是虚拟的,所以不起作用。
答案 3 :(得分:0)
可能没有区别,因为两个函数都不会访问数据成员,也不会从虚拟的任何内容派生。
但是在一般情况下,“bar”会无限快,因为“foo”作为成员函数通常必须传递并使用另一个参数 - “this”