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