コンテキストのビット:参照を使用するときにコンパイラの最適化をテストしていました(非常に良いです)。 ある時点で、構造体コンストラクタへの参照によって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つの宣言を維持することをお勧めします。 – Galik
'int&ref1、ref2'の' ref2'は参照ではありません。 '&'は 'ref1'に適用され、' int'には適用されません。 –
ああ、私は本当にそれを逃した。ありがとうございました! – pdp11