分支预测和变量声明

branch prediction and variable declaration

据我了解,如果我有:

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] 并且这样可以避免冗余声明(如果分支预测器错误)但是这会让我创建一个比我可能需要的更长的数组......

性能方面的问题: 将数组声明移到我的函数的头部,还是将它留在我的 if-else 的每个 case 中是个好主意?

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

据我了解你的问题, 虽然,这取决于要求,可能并不总是适用,但 您可能应该按照约定 并根据 良好的编程习惯 编写 使用 char[Max_Size]可读代码

避免冗余也是一个好习惯。

此外,就您担心浪费资源而言...

这样的情况下可能会浪费更多
fun1(){
char x[10000];
...
}

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

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

而不是简单的 char x[MAX_SIZE];

希望对您有所帮助:)

在你的例子中,char x[] 的声明不是多余的,即使它们声明的对象具有相同的名称。但是,由于这些对象具有不同的 scope,因此它们的其他所有内容都不同,包括它们的类型(一个是 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);

这种方法避免了将字符串文字复制到可写内存中,可能比良好的分支预测为您节省更多。