且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

是同一函数的两个函数指针总是相等吗?

更新时间:2023-11-29 18:24:22

C ++ 11标准的§5.10/ 1说:


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


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



通过使用函数的地址,可以防止它被内联(不同于 inline ,这是为了避免违反单一定义规则)。

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


Does the C++ standard guarantee that two pointers to a function always compare equal? I understand that this will normally be true for non-inline functions. But if there is an inline function and a pointer to the function is created in two separate compilation units, will the linker merge the two instantiations, or is it allowed to emit duplicate functions?

If the answer to the above is "they are equal": Does this still hold if there is a common header with an inline function, and both the main program and a dynamically loaded plugin (shared object/DLL) create a pointer to the function?

Section §5.10/1 of the C++11 standard says:

Two pointers of the same type compare equal if and only if they are both null, both point to the same function, or both represent the same address

Two copies of the same inline function are still the same function. From an implementation point-of-view, the compiler will generate a copy of the function in each translation unit but the linker will then throw one of the copies away so only one is remaining.

By taking the address of a function you prevent it from being inlined (different from inline, which is more about avoiding violation of the One Definition Rule).

DLLs are outside the scope of the standard but only one copy of the function will remain in the binary image so getting the function address (e.g. GetProcAddress) from the DLL will get the same function pointer as code inside the DLL.