我一直在“逆向工程”自己的一些库,以了解更多有关编译器优化的知识。 我发现我的最简单的类构造函数(一个4-D向量)被编译成以下内容:
fldz ; push +0.0 to FPU stack
mov eax, ecx ; set eax to this (ecx)
mov dword ptr [eax], offset data_??_7vector_t@data@@6B@ ; what is this doing?
fst dword ptr [eax+4] ; assign this->first
fst dword ptr [eax+8] ; assign this->second
fst dword ptr [eax+0Ch] ; assign this->third
fstp dword ptr [eax+10h] ; assign this->fourth, pop FPU stack
retn ; return this (eax)
在第三行,我不知道这是在做什么。我最初认为这可能是一种引用某个硬编码的常量数据块的优化方式。为了确定它可能是什么,我将DLL加载到一个容器进程中,然后附加调试器并查看位于data??_7vector_t@data@@6B@位置的数据,但只是db offset unk??_7vector_t@data2@@6B@。我跟随了第二个标签,发现有一段数据区域,即使将前8个字节转换为double后,也没有对应于我在项目中识别出来的任何东西。我使用的编译器是带有Visual Studio 2013的MSVC++,没有使用任何先进的指令集(SSE等已关闭)。哪些C++代码会产生这个问题?
data??_7vector_t@data@@6B@
我认为这是一个符号重整的名称。 - ikh