c ++中的静态成员函数是在多个翻译单元中复制的吗?

cpp*_*der 8 c++ static-members

我的程序中有一个辅助类,它在我的程序的不同类中使用了许多静态函数.例如

helper.h:

Class helper {
 public: 
   static void fn1 () 
   { /* defined in header itself */ }

   /* fn2 defined in src file helper.cpp */
   static void fn2(); 
}
Run Code Online (Sandbox Code Playgroud)

Helper只有静态成员函数.因此,其他模块不会创建任何辅助对象.辅助函数用于其他模块,如:

A.cpp

#include "helper.h"
A::foo() {
  helper::fn1(); 
  helper::fn2();
}
Run Code Online (Sandbox Code Playgroud)

B.cpp

#include "helper.h"
B::foo() {
  helper::fn1();
  helper::fn2(); 
}
Run Code Online (Sandbox Code Playgroud)

编译器是否在A.cpp和中创建了辅助函数的单独副本B.cpp?我读了一些早期的帖子,我从编译器将创建的回复中收集到了.但是,当我打印的地址fn1,并fn2作为printf("Address of fn1 is %p\n", &helper::fn1);printf("Address of fn1 is %p\n", &helper::fn1);来自A.cppB.cpp,我得到了相同的地址.我现在很困惑.有人可以澄清,如果我错过了什么.

我担心辅助函数的多个副本(如果它发生)的原因是我们正在尝试减少我们的可执行文件大小并希望优化它.

Ben*_*igt 10

在类体内定义的函数是隐式标记的inline.如果您获取函数的地址,编译器也将创建函数的常规副本(每个编译单元),但链接器将只选择其中一个副本以包含在可执行文件中,因此只有一个地址.

但是,内联过程可以创建函数的许多副本,甚至超过编译单元的数量.通常,通过消除参数传递和函数调用开销以及消除公共子表达式的机会等,可以通过增加的优化来增加重复代码的增加的大小.尽管内联通常被认为是大小和速度之间的权衡,但是大小增加通常可以忽略不计甚至是否定的.

刚刚在类中声明然后在单个编译单元中实现的函数,在可执行文件中肯定只有一个副本.