两个函数指针是否始终相同?

tbl*_*her 27 c++ function-pointers

C++标准是否保证两个指向函数的指针始终相等?我理解这对于非内联函数通常是正确的.但是如果有一个内联函数并且在两个单独的编译单元中创建了指向该函数的指针,那么链接器是否会合并两个实例,或者它是否允许发出重复的函数?

如果上面的答案是"它们相等":如果有一个带内联函数的公共头文件,并且主程序和动态加载的插件(共享对象/ DLL)都创建了一个指向该函数的指针,它是否仍然成立?

Sim*_*ple 26

C++ 11标准的第5.10/1节说:

相同类型的两个指针比较相等,当且仅当它们都为空时,都指向相同的函数,或者两者都表示相同的地址

两个相同inline功能的副本仍然是相同的功能.从实现的角度来看,编译器将在每个转换单元中生成函数的副本,但链接器将抛出其中一个副本,因此只剩下一个副本.

通过获取函数的地址,可以防止它被内联(不同于inline,更多的是避免违反单一定义规则).

DLL不在标准范围内,但只有一个函数副本将保留在二进制映像中,因此GetProcAddress从DLL 获取函数地址(例如)将获得与DLL内部代码相同的函数指针.

  • 我认为你的措辞很混乱.关键是,在获取函数的地址时,您永远不会得到"内联"副本.你得到_the_外部可见的函数定义.这甚至可以用于强制函数模板的实例化,即使它没有以其他方式使用. (6认同)

Jes*_*ood 8

C++标准是否保证两个指向函数的指针始终相等?

是的,指向同一函数的两个指针比较相等.

如果有一个带内联函数的公共头文件,并且主程序和动态加载的插件(共享对象/ DLL)都创建了一个指向该函数的指针,这仍然有效吗?

是的,根据7.1.2.p4

具有外部链接的内联函数在所有翻译单元中应具有相同的地址.