2016-06-26 16 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]を作成することができ、この方法で冗長な宣言を避けることができます(分岐予測子が間違っている場合)が、おそらく必要以上に長い配列を作成できます。配列の宣言を関数の頭に動かすか、if-elseの各ケースの中に置いておくのは良い考えですか?

編集:このコードのパフォーマンスの変更はほとんどなく、おそらく認識されませんが、プリンシパルについての質問です。私の知る限りは、あなたの質問を理解できるよう

+0

注: '' 1 ''は' char'ではありません - 'string'です。パフォーマンスに関しては、最適化とメモリ節約はごくわずかです。 –

+3

この例では、分岐予測の影響は無駄です。ランタイムは、printf()関数呼び出しによって完全に支配されています。 – wildplasser

+0

@BatCoder私は文字列であることを意味しました。別に言及しましたか? – CIsForCookies

答えて

3

が冗長ではありません、彼らは宣言オブジェクトが同じ名前を持っているにもかかわらず。しかし、これらのオブジェクトは異なるスコープを持っているので、それらのオブジェクトのタイプ(1つはchar[2]、もう1つは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

、 それは要件に依存し、常に適用されないかもしれませんが、あなたはおそらく規則と良いプログラミングにあったあたりとしてのchar [MAX_SIZE]で行くべき 、が、

readbleコードを書くの実践はまた、冗長を避けることをお勧めします。また

、限り、あなたがリソースを浪費を懸念しているとして...

それはおそらくより

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

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

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

ではなく、単純な文字X [MAX_SIZE]のような状況に浪費されます。

はそれが役に立てば幸い:) char x[]のあなたのケースの宣言には