使用/ 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类,那么为什么这些函数在未使用的情况下会被生成?
整个计划优化已经到位。
答案 0 :(得分:3)
“那么为什么不使用这些函数会产生?”
您正在检查为单个翻译单元生成的程序集代码,而不是检查链接后的最终程序集。
链接器最终会删除所有未使用的函数。