我在我的程序中有一个帮助类,它具有许多静态函数,这些函数在程序的不同类中使用。例如:
helper.h
:
Class helper {
public:
static void fn1 ()
{ /* defined in header itself */ }
/* fn2 defined in src file helper.cpp */
static void fn2();
}
Helper类仅有静态成员函数。因此,其他模块不会创建Helper类的对象。帮助函数在其他模块中使用,如:
A.cpp
#include "helper.h"
A::foo() {
helper::fn1();
helper::fn2();
}
B.cpp
#include "helper.h"
B::foo() {
helper::fn1();
helper::fn2();
}
编译器会在A.cpp
和B.cpp
中创建 helper 函数的独立副本吗?我看了一些早期的帖子,并从回复中得出是会这样做的结论。但当我从A.cpp
和B.cpp
分别打印fn1
和fn2
的地址,例如:printf("Address of fn1 is %p\n", &helper::fn1);
和printf("Address of fn1 is %p\n", &helper::fn1);
,我得到的地址是相同的。现在我感到困惑了。是否有人可以澄清一下,我是否漏掉了什么。
我担心 helper 函数会存在多个副本(如果发生的话),因为我们正在尝试减少可执行文件的大小并对其进行优化。
T
值来特化模板,然后你会得到链接器错误。编译器将为每个不同的T
生成一个fn2<T>
,而导致编译器执行此操作的编译单元数量并不重要,因为链接器只会保留一个(针对每个T
)。 - Ben Voigt