分支预测和变量声明
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);
这种方法避免了将字符串文字复制到可写内存中,可能比良好的分支预测为您节省更多。
据我了解,如果我有:
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);
这种方法避免了将字符串文字复制到可写内存中,可能比良好的分支预测为您节省更多。