少しコンテキスト:参照を使用するときにコンパイラの最適化をテストしていました(ところで、それらは非常に優れています)。ある時点で、構造体コンストラクターを参照して2つのオブジェクトを渡しました...そして物事は奇妙になりました。構造体の外側にあるオブジェクトの1つに加えられた変更を確認できますが、他のオブジェクトは確認できません。
私はそれが意味するものの最小限の実用的な例を持ってきました:
//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を使用してg ++ v5.4で生成されたアセンブラ
foo(int):
cmp edi, 1
je .L3
cmp edi, 2
jne .L9
xor eax, eax
ret
.L9:
rep ret
.L3:
mov eax, 1
ret
ここに実例
-1をfooに渡すと、コードは.L3にジャンプし、aに加えられた変更を反映して1を返します。
-しかし、fooに2を渡すと、コードは.L9にジャンプし、bに加えられた変更を無視して、0を返します。
なぜこれが起こっているのか私には分かりません。それについて何か考えはありますか?
[編集]一人で作業しているときは、サークルで実行するのは本当に簡単です。実際、ref2のタイプはint&ではなくintです。返信ありがとうございます!
あなたが宣言ref1
し、参照をref2
行う方法ですが、値です。ref1
int
ref2
int
構造体に2つの参照があるという正しい宣言は、次のようになります。
int &ref1, &ref2;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加