繁体   English   中英

外部与内部的联系与绩效

[英]external vs internal linkage and performance

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

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

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

我想知道哪个函数将是最快调用的,这是什么折衷。

谢谢

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

链接对效率没有影响。 内联可能有,但是取决于太多变量。

只是为了清楚。

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

如其他地方所述。 inline对链接没有影响。 同样,在方法声明/定义中如上所述使用的static不带有任何链接语义。 不幸的是static是一个过度使用的关键字。 当在全局/命名空间作用域变量/函数上使用时,它将实现链接。 当应用于类方法时,它具有完全不同的含义。

至于您的问题,他们都有外部联系。 它们在被调用时都具有相同的性能。 如果在cpp文件中而不是在类中定义了其他两个函数并且编译器决定内联调用fooInline会更快,则内联MIGHT具有优势。 fooInline在定义foofooStatic的源文件中没有任何优势。

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

inline每个语句都没有“链接”,它通常(尽管编译器不必遵从)只是将代码按字面意思放入内联。

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

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

要么:

static void foo() { ... }

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

第二个内部链接自您声明为静态以来。 只能在同一翻译单元中引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM