编译c ++到汇编会提高性能吗?

时间:2016-08-11 06:47:39

标签: c++ assembly

我想在网站上发布一个问题,而我的问题完全符合规则 它错误

这是我的问题(是否可以将c ++代码转换为汇编代码或机器代码以获得性能? 我知道低级语言在硬件上运行速度更快,因为直接访问硬件而高级语言需要编译 所以我的想法是编译一次c ++代码并保存并运行编译版本 它实用吗? 我听说它需要1-1编译器存在这样的事情吗?)

4 个答案:

答案 0 :(得分:7)

C ++(几乎)总是在执行之前编译成程序集。所以它不能转换为汇编,因此问题并没有真正意义。当然,您可以将其转换为汇编然后对其进行优化,但是极少数情况下这实际上会提高性能(而且您必须真正知道自己在做什么)。通常,它更容易开始优化C ++代码(即通过减少所需的循环数或添加缓存)。

答案 1 :(得分:3)

像C / C ++这样的非托管语言并没有托管语言这样的运行时引擎(C#,Java)。 C ++代码将由编译器编译,编译器将生成 object 文件(称为中间文件)。然后链接器将读取这些目标文件以生成一个可执行文件文件(一般意义上)。

可执行文件(或DLL / SO)包含将由处理器直接处理的本机指令。因此,如果将程序编译为32位(x86),则编译器/链接器生成的指令集将仅由x86 CPU指令集构成 - 不涉及运行时引擎。

因此,提出汇编代码并不合理。 ASM代码可以由编译器生成,仅供程序员知道生成的内容(例如,作为文本文件)。

答案 2 :(得分:2)

没有。编译C ++源代码时,无论如何都会将其编译为机器代码。您既可以通过优化C ++代码来获得性能,也可以编写想要在汇编语言中优化的代码,然后可以在尽可能低的级别上优化代码以获得性能,而只需编译代码然后再使用它那样不会有帮助。

答案 3 :(得分:2)

  

是否可以将c ++代码转换为汇编代码或机器代码

通常,每个c ++编译器都会为可执行文件生成机器代码。如果需要,可以获取汇编程序文件。

关于gcc的例子:

 g++ -S -c main.cpp

这将生成一个main.s文件,您可以在其中看到生成的程序集(仅显示一小段主要函数):

   .globl  main
    .type   main, @function
 main:
 .LFB3028:
    .cfi_startproc
    .cfi_personality 0x3,__gxx_personality_v0
    .cfi_lsda 0x3,.LLSDA3028
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16 
   .cfi_def_cfa_offset 24
    .cfi_offset 3, -24 
    movl    $48, %edx
    movl    $.LC15, %esi
    subq    $552, %rsp
    .cfi_def_cfa_offset 576 
    leaq    32(%rsp), %rbx
    movq    %rbx, %rdi
 .LEHB3:
    call    _ZNSt14basic_ofstreamIcSt11char_traitsIcEEC1EPKcSt13_Ios_Openmode
  

获得表现?

完全没有,因为你所有的建议已经完成: - )

  

虽然更高级别的语言需要编译所以我的想法是编译c ++代码一次并保存并运行编译版本是否实用

这正是编译器已经做的!它将您的c ++代码编译为机器可执行文件(机器代码)。所以一切都准备好了。

您可以查看汇编输出,以了解您编写的特定代码片段将如何在您的计算机上运行。也许您有机会以更好/更小/更快的方式手写它。但事实上,如果我们谈论现实世界的应用程序,今天的编译器比任何手工编写的代码要好得多。也许你有一些时间关键的中断例程,你可以保存一些指令。

您想到的场景仅适用于脚本语言,其中文本文件可能在运行时预编译,或者在执行应用程序之前由“编译器”预编译,并且某些字节代码将在运行时执行这种语言的时间引擎就像在java中一样。但对于c ++来说,情况并非如此。