[英]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
在定义foo
和fooStatic
的源文件中没有任何优势。
所有这些听起来像过早的优化。 还有其他值得解决的问题将使您的代码更快。
inline
每个语句都没有“链接”,它通常(尽管编译器不必遵从)只是将代码按字面意思放入内联。
您会看到与匿名名称空间和(独立的,不是类的)静态函数的内部链接,例如
namespace
{
void foo() { ... }
}
要么:
static void foo() { ... }
内部链接意味着编译器可以做一些额外的优化(因为它确切地知道函数的使用方式),而不必创建导出的符号,这意味着启动时的重定位更少(意味着更快的启动,尽管现代的链接器确实可以)惰性符号解析...)
第二个内部链接自您声明为静态以来。 只能在同一翻译单元中引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.