【问题标题】:investigating visual studio assembly output调查视觉工作室装配输出
【发布时间】:2015-03-29 07:54:04
【问题描述】:

使用 /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

如您所见,构造函数和初始化函数都生成了“琐碎”的实现函数。

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

整个程序优化到位。

【问题讨论】:

  • “那么,如果不使用这些函数,为什么会生成这些函数?” 您正在检查为单个翻译单元生成的汇编代码,而不是链接后的最终汇编。链接器最终会删除所有未使用的函数。
  • @πάνταῥεῖ 所以链接器完成的最终工作是不可见的,但在最终的可执行文件中。

标签: c++ visual-studio assembly


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多