предсказание ветвлений и объявление переменных

Как я понимаю, если у меня есть:

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?

EDIT: я знаю, что любое изменение производительности в этом коде будет очень небольшим и, вероятно, не будет распознано, но вопрос был о принципале.


person CIsForCookies    schedule 26.06.2016    source источник
comment
Примечание: "1" — это не char, а string. Что касается производительности, ваша оптимизация и экономия памяти незначительны.   -  person abhishek_naik    schedule 26.06.2016
comment
В этом примере влияние предсказания перехода бесполезно. В среде выполнения полностью доминируют вызовы функции printf().   -  person wildplasser    schedule 26.06.2016
comment
@BatCoder Я имел в виду, что 1 будет строкой. Я упоминал иное?   -  person CIsForCookies    schedule 26.06.2016
comment
Конкретный эффект прогнозирования ветвления (любой другой работы вашего процессора) будет зависеть от контекста. Любая оптимизация, сделанная сейчас, с большой вероятностью бесполезна, если вы измените код. Код очень выглядит недоработанным.   -  person Peter G.    schedule 26.06.2016
comment
@Питер Г. этот код является просто примером - я хотел знать, должно ли объявление массива находиться внутри ветки или снаружи, без каких-либо других опций компилятора.   -  person CIsForCookies    schedule 26.06.2016


Ответы (2)


В вашем случае объявления 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);

Этот подход позволяет избежать копирования строковых литералов в доступную для записи память, что может сэкономить вам намного больше, чем хорошее предсказание ветвлений.

person Sergey Kalinichenko    schedule 26.06.2016

Насколько я понял ваш вопрос, хотя это зависит от требований и может не всегда применяться, но вам, вероятно, следует использовать char[Max_Size] в соответствии с соглашениями и в соответствии с good практика программирования написания читабельного кода

Также рекомендуется избегать избыточности.

Более того, насколько вы обеспокоены растратой ресурсов...

это, вероятно, было бы более напрасным в такой ситуации, как

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

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

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

вместо простого char x[MAX_SIZE];

Надеюсь, поможет :)

person eRaisedToX    schedule 26.06.2016