我想在网站上发布一个问题,而我的问题完全符合规则 它错误
这是我的问题(是否可以将c ++代码转换为汇编代码或机器代码以获得性能? 我知道低级语言在硬件上运行速度更快,因为直接访问硬件而高级语言需要编译 所以我的想法是编译一次c ++代码并保存并运行编译版本 它实用吗? 我听说它需要1-1编译器存在这样的事情吗?)
答案 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 ++来说,情况并非如此。