2016-06-26 57 views
1

按我的理解,如果我有一个:分支预测和变量声明

if(case 1) 
{ 
    char x[] = "1"; 
    printf("%s",x); 
} 
else if(case 2) 
{ 
    char x[] = "12"; 
    printf("blah-blah-blah\n"); 
    printf("%s",x); 
} 

然后我的编译器将尝试预测分支代码将进入,这样一来,提高了执行流程。我可以在这个函数的开始创建我char x[MAX_SIZE]和这样避免冗余的声明(如果分支预测是错误的),但会让我创建一个更长的阵列比我可能会需要...

问性能-wise:将数组声明移动到我的函数头部,还是将它放在我的if-else的每个case中都是一个好主意?

编辑:我知道这段代码中的任何性能变化都很小,可能不会被识别,但问题是关于校长。

+0

注意:'“1”不是'char' - 它是一个'string'。至于性能,您的优化和内存节省可以忽略不计。 –

+3

在这个例子中,分支预测的影响是徒劳的。运行时完全由printf()函数调用支配。 – wildplasser

+0

@BatCoder我的意思是“1”是一个字符串。我有否另外提到? – CIsForCookies

回答

3

char x[]你的情况声明是不是多余的,即使他们申报的对象具有相同的名称。但是,由于这些对象具有不同的范围,因此它们的一切都不相同,包括它们的类型(一个是char[2],另一个是char[3])。

它看起来并不像你需要你的x对象是可写的,所以你可以使用一个指针,像这样:

char *x; 
if (case 1) { 
    x = "1"; 
} else if (case 2) { 
    x = "12"; 
    printf("blah-blah-blah\n"); 
} 
printf("%s", x); 

这种方法避免了复制的字符串文字转换为可写内存,可能节省你很多不仅仅是一个好的分支预测。

-1

至于我能理解你的问题, 虽然,它取决于需求,可能并不适用总是但是 你或许应该焦炭去[MAX_SIZE]按照惯例并与良好的编程协议写作readble代码

实践此外,它是一个很好的做法,以避免冗余

此外,至于你担心浪费资源......

,很可能会浪费更多的情况怎么样

fun1(){ 
char x[10000]; 
... 
} 

fun2(){ 
char x[5000]; 
... 
} 

fun3(){ 
char x[10000]; 
... 
} 

,而不是一个简单的字符X [MAX_SIZE];

希望它能帮助:)