据我所知,如果我有一个:
if(case 1)
{
char x[] = "1";
printf("%s",x);
}
else if(case 2)
{
char x[] = "12";
printf("blah-blah-blahn");
printf("%s",x);
}
,那么我的编译器将尝试预测代码将进入的分支,这样可以改善执行流程。我可以在这个函数的头部创建我的char x[MAX_SIZE]
,这样可以避免冗余的声明(如果分支预测器是错误的),但这将使我创建一个比我可能需要的更长的数组…
询问性能:将数组声明移动到函数的头部或将其留在if-else的每个情况下是一个好主意吗?
EDIT:我知道这段代码中的任何性能变化都很小,可能不会被识别出来,但问题是关于主体的。
在您的例子中,char x[]
的声明不是多余的,即使它们声明的对象具有相同的名称。但是,由于这些对象具有不同的作用域,因此它们的其他一切都是不同的,包括它们的类型(一个是char[2]
,另一个是char[3]
)。
看起来你不需要你的x
对象是可写的,所以你可以使用指针,像这样:
char *x;
if (case 1) {
x = "1";
} else if (case 2) {
x = "12";
printf("blah-blah-blahn");
}
printf("%s", x);
这种方法避免了将字符串文字复制到可写内存中,潜在地比一个好的分支预测节省了很多。
就我对你问题的理解而言,虽然,这取决于需求,可能并不总是适用,但你可能应该使用char[Max_Size]作为约定,并符合良好的编程实践编写可读代码
避免冗余也是一个很好的实践。
此外,就你所关心的浪费资源…
在
这样的情况下可能会更浪费。fun1(){
char x[10000];
...
}
fun2(){
char x[5000];
...
}
fun3(){
char x[10000];
...
}
而不是简单的char x[MAX_SIZE];
希望有帮助