调查视觉工作室组装输出

时间:2015-03-29 07:54:04

标签: c++ visual-studio assembly

使用/ FA选项编译使用此虚拟类的代码

class A  {
public:
    A() {}
    int Initialize() {
        return 0;
    }
};

我查看了生成的asm文件,其中定义了这个文件并使用了,并在asm文件中看到了这个文件

PUBLIC  ?Initialize@A@@QEAAHXZ              ; A::Initialize
PUBLIC  ??0A@@QEAA@H@Z                  ; A::A

??0A@@QEAA@H@Z PROC                 ; A::A, COMDAT
; File d:\dev\temp\consoleapplication1\consoleapplication1\consoleapp2.cpp
; Line 7
    mov rax, rcx
    ret 0
??0A@@QEAA@H@Z ENDP                 ; A::A
_TEXT   ENDS
; Function compile flags: /Ogtpy
;   COMDAT ?Initialize@A@@QEAAHXZ
_TEXT   SEGMENT
this$dead$ = 8
?Initialize@A@@QEAAHXZ PROC             ; A::Initialize, COMDAT
; File d:\dev\temp\consoleapplication1\consoleapplication1\consoleapp2.cpp
; Line 9
    xor eax, eax
; Line 10
    ret 0
?Initialize@A@@QEAAHXZ ENDP             ; A::Initialize

正如您所看到的,为构造函数和Initialize函数生成了“普通的”实现函数。

起初我认为这个非内联实现将在使用A类的地方使用,但调试显示情况并非如此(代码似乎是内联的)。除了这个asm文件之外的其他任何地方都没有使用A类,那么为什么这些函数在未使用的情况下会被生成?

整个计划优化已经到位。

1 个答案:

答案 0 :(得分:3)

  

“那么为什么不使用这些函数会产生?”

您正在检查为单个翻译单元生成的程序集代码,而不是检查链接后的最终程序集。

链接器最终会删除所有未使用的函数。

相关问题