这是一段看似非常特殊的C++代码.出于某种奇怪的原因,奇迹般地对数据进行排序使得代码几乎快了六倍.
#include <algorithm>
#include <ctime>
#include <iostream>
int main()
{
// Generate data
const unsigned arraySize = 32768;
int data[arraySize];
for (unsigned c = 0; c < arraySize; ++c)
data[c] = std::rand() % 256;
// !!! With this, the next loop runs faster.
std::sort(data, data + arraySize);
// Test
clock_t start = clock();
long long sum = 0;
for (unsigned i = 0; i < 100000; ++i)
{
// Primary loop
for (unsigned c = 0; c < arraySize; ++c) …Run Code Online (Sandbox Code Playgroud) 可能重复:
为什么使用goto不好?
GOTO仍被视为有害吗?
我通过xkcd进行了调整,看到了这个(几年前还读了一些关于它们的负面文章):

这究竟是什么问题?为什么goto甚至可以在C++中使用呢?
我为什么不使用它们?
我在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缓存通常会使堆栈保持关闭状态.是否会出现由于未正确使用缓存而导致性能损失的情况.与时间效率方面的跳跃相比,调用函数的实际成本是多少.在效率方面,有很多方法可以比较和对比两种编程风格.