哪个C ++代码更有效?

时间:2014-07-24 13:54:12

标签: c++ optimization performance

我试图优化我的代码。我听说最好不要使用局部变量并减少函数参数的数量,所以目前程序的结构如下所示:

using namespace std;    
const string UPLOAD_LOCATION = "/uploads";    
const int value = 100;
const int type = 0;
const int max_value = 255;    
string var1, var2, var3;

void func1();
void func2();
void func4();

int main(int argc, char *argv[])
{
    func1();
    func2();
}

void func1()
{
  //do something
}

void func2()
{
  func4();
  //do something
}

void func4()
{
  //do something
}

如果var1,var2和var3是main函数中的局部变量,那么它会更有效吗?所以我将它们作为参数传递给函数?我的意思是这样的:

using namespace std;    
const string UPLOAD_LOCATION = "/uploads"; 

void func1();
void func2();
void func4();

int main(int argc, char *argv[])
{
    const int value = 100;
    const int type = 0;
    const int max_value = 255;    
    string var1, var2, var3;

    var1 = func1(var2, value, type, max_value);
    var3 = func2(var2);
}

string func1(string &var2)
{
  //do something
}

void func2(string &var2)
{
  func4(var2);
  //do something
}

void func4(string &var2)
{
  //do something
}

如果是,通过引用或值传递它们会更好吗?例如,假设函数将结果存储在字符串s中,那么我应该选择哪个:

a) void func( string in, string &result )    

b) string func( string in )

4 个答案:

答案 0 :(得分:10)

不要将所有本地人和参数全局化

没有......只是......停止。

让自己和其他人理解你的代码。这应该是你的目标。这就是你可以做到的计算机无法做到的事情。

让您的编译器优化。这就是它比你更好的方式。如果某些变量没有放在堆栈上,事情会运行得更快,那么你的编译器应该能够很好地识别它。

如果您在创建类和方法时需要更具体的设计目标,请尝试最小化coupling并最大化cohesion。很多时候,当你这样做时,你甚至会发现你可以免费获得效率。

如果结果不够快,无法满足要求,只需将编译器的优化设置完全填满,那么您是否真的应该关注手工优化。在这种情况下,您会得到一个profiler并且实际衡量代码的哪些部分浪费了最多的时间,并修复了这些部分。这样你就不会像盲人拳击手那样磕磕碰碰。

答案 1 :(得分:3)

我会抓住几个问题

过去,如果您不担心调用该值的方法,则最好通过引用然后传递值。如果你通过值传递它必须做一个复制构造,如果你通过引用传递它只是传递一个指针。

也就是说,C ++ 11通过值传递更智能,更高效。所以这不再是一个硬性规则。有关详细信息,请参阅this文章。

参考您关于将值作为参数或方法输出返回的上一个问题。这article善于指出利弊

答案 2 :(得分:1)

  

过早优化是万恶之源

首先使您的程序可读。然后让它工作,只有在必要时才进行优化。首先在算法级别优化它,然后通过分析器运行,找到程序大部分时间花在哪里并优化它。

问题:

void func( string in, string &result );
void func( string in );

让我们看看调用这样一个函数的方式更具可读性:

string str;
func( "foobar", str );

VS

string str = func( "foobar" );

您能否至少猜测在str调用后func()被修改后更容易理解?至于优化,C ++委员会做了很好的工作,使更自然的方式传递和返回值到函数或从函数返回值,因为它们的可读性较低。因此,不要担心什么是真正重要的,并专注于编写一个好的程序所必需的。

答案 3 :(得分:0)

  

我正在尝试优化我的代码。我听说最好不要使用局部变量并减少函数参数的数量

更好地不使用全局状态(变量和对象)并减少函数参数的数量(这是有意义的)。你在这里的困惑似乎来自于这个“它更好”意味着“出于效率原因更好”的想法。

您不会通过减少全局状态和函数参数数来优化代码的速度(或内存占用)。相反,您将划分功能并减少应用程序中各种模块的相互依赖性,从而使其更易于阅读,维护和扩展。

  

如果var1,var2和var3是main函数中的局部变量会更有效吗,所以我将它们作为参数传递给函数?

没有。这与效率无关(但是相同代码的第二个示例更容易阅读)。