与调用函数相比,goto语句是否有效?

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级别的智能)可能会生成具有常规函数调用的快速或更快的代码,更不用说维护方面了.

  • 我非常不喜欢有关优化的问题的答案,这些问题说"编译器比你更聪明".现在可能是真的,但要做到这一点并不需要太多.在很大程度上,编译器远非聪明; 他们只是快速而持久.关于代码大小的第二段也具有误导性; 与具有高级代码知识的合格程序员相比,这里的编译器实际上处于不利地位.但是,虽然我不同意大多数答案,但内联主要在函数上执行的基本点是正确的. (3认同)

Jam*_*mes 14

goto语句是否直接转换为机器代码,它告诉计算机JUMP到另一个内存地址?

差不多.

与调用函数的成本相比,机器中的这种成本是否更低?

函数调用将进行非常相似的跳转,但在跳转之前,必须为新函数设置新的堆栈帧,根据调用约定推送参数,最后设置任何返回价值和放松.是的,不这样做可能会更快.

我有点疯狂

是.