Why are (member) function pointers behaving so weirdly in Visual C++?

后端 未结 3 1994
太阳男子
太阳男子 2020-12-14 06:48

I\'ve had a really bizarre problem that I\'ve reduced to the following test case:

#include 
#include 
#include 

str         


        
3条回答
  •  情深已故
    2020-12-14 07:42

    This is a by-product of what Visual C++ refers to as Identical COMDAT Folding (ICF). It merges identical functions into a single instance. You can disable it by adding the following switch to the linker commandline: /OPT:NOICF (from the Visual Studio UI it is found under Properties->Linker->Optimization->Enable COMDAT Folding)

    You can find details at the MSDN article here: /OPT (Optimizations)

    The switch is a linker-stage switch, which means you won't be able to enable it just for a specific module or a specific region of code (such as __pragma( optimize() ) which is available for compiler-stage optimization).

    In general, however, it is considered poor practice to rely on either function pointers or literal string pointers (const char*) for testing uniqueness. String folding is widely implemented by almost all C/C++ compilers. Function folding is only available on Visual C++ at this time, though increased widespread use of template<> meta-programming has increased requests for this feature to be added to gcc and clang toolchains.

    Edit: Starting with binutils 2.19, the included gold linker supposedly also supports ICF, though I have been unable to verify it on my local Ubuntu 12.10 install.

提交回复
热议问题