我试图优化我的代码。我听说最好不要使用局部变量并减少函数参数的数量,所以目前程序的结构如下所示:
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 )
答案 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函数中的局部变量会更有效吗,所以我将它们作为参数传递给函数?
没有。这与效率无关(但是相同代码的第二个示例更容易阅读)。