2017-09-16 2 views
2

コンテキストのビット:参照を使用するときにコンパイラの最適化をテストしていました(非常に良いです)。 ある時点で、構造体コンストラクタへの参照によって2つのオブジェクトが渡されました。構造体の外側にあるオブジェクトの1つに加えられた変更は見ることができますが、他のものは変更できません。wierdの結果を生成するオブジェクトへの参照の格納

私はそのことで何を意味するか、最小限の作業例で来た:

//TwoInts has two references to int 
//For whatever reason I can only see outside changes 
//done to the int pointed by ref1 ! 
struct TwoInts{ 
    int& ref1,ref2; 
    TwoInts(int& r1,int& r2):ref1(r1),ref2(r2){} 
}; 

int foo(int select){ 
    int a=0,b=0; 
    TwoInts two(a,b); 

    switch(select){ 
     case 1: 
      a=1; //This line changes the output 
      return two.ref1; //Returns 1, ok 
      break; 
     case 2: 
      b=2; //This line DOESN'T change the output 
      return two.ref2; //Returns zero! 
      break; 
    } 
} 

-O2

foo(int): 
    cmp edi, 1 
    je .L3 
    cmp edi, 2 
    jne .L9 
    xor eax, eax 
    ret 
.L9: 
    rep ret 
.L3: 
    mov eax, 1 
    ret 

ライブ例here

を使用してG ++ V5.4で生成されたアセンブラ - 1をfooに渡すと、コードは.L3にジャンプし、1に戻ります。

- しかし、2をfooに渡すと、コードは.L9にジャンプし、0を返します。を無視して、をbに変更しました。

なぜこれが起こっているのかわかりません。それについての考えは?

[編集] あなたが一人で働いているときにサークルで実行するのは本当に簡単です。実際、ref2の型はint型であり、int型ではありません&です。返信ありがとう!

+1

このようなミスは簡単ですと、1行に1つの宣言を維持することをお勧めします。 – Galik

+0

'int&ref1、ref2'の' ref2'は参照ではありません。 '&'は 'ref1'に適用され、' int'には適用されません。 –

+0

ああ、私は本当にそれを逃した。ありがとうございました! – pdp11

答えて

3

あなたがref1を宣言しているとref2ref1int参照けどref2int値を作る方法。

あなたの構造体に2つの参照を持って正しい宣言は次のようになります。

int &ref1, &ref2; 
関連する問題