外部与内部联系和绩效

时间:2009-11-24 15:50:55

标签: c++

假设我在一个类中有3个函数:

class Foo {
    inline void FooInline() { /* bla bla */ }
    static void fooStatic();
    void foo();
};

据我所知,最后两个有外部联系而第一个有内部。

我想知道哪个函数调用最快,以及什么是权衡。

感谢

4 个答案:

答案 0 :(得分:5)

不,这三个都有外部联系。非本地类的成员函数在C ++中始终具有外部链接。此外,inline对链接没有影响,即使它是非成员函数。

Linkage对效率没有影响。内联可能有,但它取决于太多的变量。

答案 1 :(得分:1)

只是为了清楚。

class fooClass
{
   inline void fooInline() { /*blah blah*/ }
   static void fooStatic() { /*blah blah*/ }
   void foo() { /*blah blah*/ }
};

如其他地方所述。 inline对链接没有影响。此外,在方法声明/定义中使用的static也不带任何链接语义。遗憾的是,static被过度用作关键字。当在全局/命名空间范围变量/函数上使用时,它会影响链接。当应用于类方法时,它具有完全不同的含义。

至于你的问题,他们都有外部联系。它们在调用时都具有相同的性能。内联 MIGHT 具有优势 IF 另外两个函数在cpp文件中定义而不是类 AND 编译器决定它会更快内联fooInline的来电。 fooInline在定义foofooStatic的源文件中没有任何优势。

所有这些听起来都像是过早优化。还有其他值得解决的问题会使您的代码更快。

答案 2 :(得分:0)

inline每个说法没有“链接”,它通常(尽管编译器不必遵守)只是按字面意思放置代码,呃,内联。

您会看到与匿名命名空间和(独立的,而不是类)静态函数的内部链接,例如

namespace
{
  void foo() { ... }
}

或者:

static void foo() { ... }

内部链接意味着编译器可以进行一些额外的优化(因为它确切地知道如何使用该函数)并且不必创建导出的符号,这意味着启动时的重定位更少(意味着更快的启动 - 尽管现代连接器做懒惰的符号解析...)

答案 3 :(得分:-1)

第二个具有内部链接,因为您将其声明为静态。它只能在同一个翻译单元中引用。