C++ 标准是否保证指向函数的两个指针总是比较相等?我知道这对于非内联函数通常是正确的。但是如果有一个内联函数并且指向该函数的指针是在两个单独的编译单元中创建的,那么链接器会合并两个实例化,还是允许发出重复的函数?
如果上面的答案是“它们相等”:如果有一个带有内联函数的公共头文件,并且主程序和动态加载的插件(共享对象/DLL)都创建一个指向该函数的指针,这是否仍然成立?
C++ 标准是否保证指向函数的两个指针总是比较相等?我知道这对于非内联函数通常是正确的。但是如果有一个内联函数并且指向该函数的指针是在两个单独的编译单元中创建的,那么链接器会合并两个实例化,还是允许发出重复的函数?
如果上面的答案是“它们相等”:如果有一个带有内联函数的公共头文件,并且主程序和动态加载的插件(共享对象/DLL)都创建一个指向该函数的指针,这是否仍然成立?
C++11 标准的§5.10/1 节说:
相同类型的两个指针比较相等当且仅当它们都为空,都指向相同的函数,或都表示相同的地址
相同功能的两个副本inline
仍然是相同的功能。从实现的角度来看,编译器将在每个翻译单元中生成函数的副本,但链接器随后将丢弃其中一个副本,因此只剩下一个。
通过获取函数的地址,您可以防止它被内联(与 不同inline
,这更多是为了避免违反单一定义规则)。
DLL 不在标准范围之内,但二进制映像中只保留一份函数副本,因此GetProcAddress
从 DLL 获取函数地址(例如 )将获得与 DLL 内代码相同的函数指针。
C++ 标准是否保证指向函数的两个指针总是比较相等?
是的,指向同一个函数的两个指针比较相等。
如果有一个带有内联函数的公共头文件,并且主程序和动态加载的插件(共享对象/DLL)都创建一个指向该函数的指针,这仍然成立吗?
是的,根据 7.1.2.p4
具有外部链接的内联函数在所有翻译单元中应具有相同的地址。