Phi*_*hil 5 c c++ assembly goto machine-code
我在C++中有以下代码:
#include <iostream>
int main(int argc, const char * argv[])
{
goto line2;
line1:
std::cout << "line 1";
goto line3;
line2:
std::cout << "line 2";
goto line1;
line3:
std::cout << "line 3";
goto line4;
line4:
std::cout << "Hello, World!\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我做了一个更大的程序,让我说10,000行代码,我决定我永远不会使用我自己编写的函数,我只使用goto语句.我只使用全局变量.就最佳实践而言,我有点疯狂,但它的用途非常特殊.问题是,使用goto语句跳转是否有效?如果我有1000个转到标签怎么办?
goto语句是否直接转换为机器代码,它告诉计算机JUMP到另一个内存地址?与调用函数的成本相比,机器中的这种成本是否更低?
我想知道,因为我想编写一个非常有效的程序来进行一些计算,我需要非常高效,而不需要求助于汇编/机器代码.
无需告诉我这在维护,代码的可理解性,最佳实践方面都是一个坏主意,我非常清楚这一点,我只想回答这个问题.我不想在它是否善于使用函数调用或使用goto之间进行任何争论.
为了澄清这个问题,我担心在这种情况下只使用带有10,000行程序的gotos,它将如何与使用函数的传统程序进行比较.有两种方法可以比较和对比这两个程序,例如CPU缓存的执行方式.没有函数调用它会给出什么样的保存.如果没有调用堆栈,这将如何影响CPU缓存,因为CPU缓存通常会使堆栈保持关闭状态.是否会出现由于未正确使用缓存而导致性能损失的情况.与时间效率方面的跳跃相比,调用函数的实际成本是多少.在效率方面,有很多方法可以比较和对比两种编程风格.
Set*_*gie 22
goto语句是否直接转换为机器代码,它告诉计算机JUMP到另一个内存地址?
是.
与调用函数的成本相比,机器中的这种成本是否更低?
是.
但是,当编译器看到函数调用时,它不必实际生成调用函数的代码.它可以采取功能的内容,并将它们粘在呼叫所在的位置,甚至不是跳跃.因此调用函数可能更有效!
此外,代码越小,它的效率就越高(一般来说),因为它更有可能适合CPU缓存.编译器可以看到这一点,并且可以确定函数何时很小并且最好内联它,或者当它很大并且更好地将它分离并使其成为真正的函数时,生成最快的代码(如果你将它设置为生成)最快的代码).你看不到这个,所以你猜,也许猜错了.
这些只是一些显而易见的问题.编译器可以做很多其他优化.让编译器决定.它比你聪明.它比我聪明.编译器知道所有.说真的,Cthulhu可能是一个编译器.
你说没有,但我会说:我强烈建议您配置文件决定做这个之前,你的代码,我几乎可以保证它不值得你的时间.编译器(大多数是近AI级别的智能)可能会生成具有常规函数调用的快速或更快的代码,更不用说维护方面了.
Jam*_*mes 14
goto语句是否直接转换为机器代码,它告诉计算机JUMP到另一个内存地址?
差不多.
与调用函数的成本相比,机器中的这种成本是否更低?
函数调用将进行非常相似的跳转,但在跳转之前,必须为新函数设置新的堆栈帧,根据调用约定推送参数,最后设置任何返回价值和放松.是的,不这样做可能会更快.
我有点疯狂
是.