参照をオブジェクトに保存すると、奇妙な結果が得られます

pdp11

少しコンテキスト:参照を使用するときにコンパイラの最適化をテストしていました(ところで、それらは非常に優れています)。ある時点で、構造体コンストラクターを参照して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行う方法です値です。ref1intref2int

構造体に2つの参照があるという正しい宣言は、次のようになります。

int &ref1, &ref2;

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

あるオブジェクトを別のオブジェクトにコピーすると、Javaで異なる結果が得られます

分類Dev

Java文字列オブジェクトのサイズを計測すると不正な結果が得られる

分類Dev

2つのNSDateオブジェクトの同等性を比較すると、予期しない結果が得られます

分類Dev

ベクトルとxtsオブジェクトに適用すると、ks.boot出力で異なる結果が得られるのはなぜですか?

分類Dev

javascript:オブジェクトの配列を並べ替えると、一貫性のない結果が得られます

分類Dev

PHP-エンコードされたオブジェクト配列から奇妙な結果が得られるのはなぜですか?

分類Dev

Paperjsが長方形にセグメントを挿入すると、奇妙な結果が得られます

分類Dev

Pythoncairoが図をnp配列として保存すると奇妙な結果が得られます

分類Dev

分類すると奇妙な結果が得られます

分類Dev

空のオブジェクトで空の配列を追加すると、オペランドを反転したときに異なる結果が得られます

分類Dev

stdinから整数を読み取ると、奇妙な結果が得られます

分類Dev

毎日の最大値を取得すると、奇妙な結果が得られます

分類Dev

カスタム関数の後、Rコンソールでオブジェクトを呼び出すと目的の結果が得られますが、環境からオブジェクトを「表示」することはできません。

分類Dev

lang cssディレクティブを使用してフォントサイズを縮小すると、奇妙な結果が得られます

分類Dev

スタックオブジェクトとヒープオブジェクトでTimes(n)を指定してgmock EXPECT_CALLを呼び出すと、異なる結果が得られるのはなぜですか?

分類Dev

BeautifulSoupでページをスクレイピングすると、奇妙な結果が得られます(最後に複数</ p>)。どうして?

分類Dev

mysqlのテーブルを更新すると奇妙な結果が得られます

分類Dev

空のサブクエリで SELECT IN を実行すると、奇妙な結果が得られる

分類Dev

Optaplannerプロジェクトのジョブスケジューリングの例を実行しますが、異なる結果が得られます

分類Dev

パーセク:動作中のパーサーを拡張すると、奇妙な結果が得られます

分類Dev

UWP:RichTextBlockでテキストの高さを計算すると奇妙な結果が得られます

分類Dev

Cでlongdoubleを使用すると、減算後に奇妙な結果が得られます

分類Dev

配列からオブジェクトにランダムな値をコピーしても安定した結果を得ることができません

分類Dev

moqdbオブジェクトで結果が得られないのはなぜですか

分類Dev

クラスインスタンスディクショナリにオブジェクトを保存すると、予期しない結果が発生します

分類Dev

RamdaJS:オブジェクトを作成すると、同じ「ランダム」な結果が生成されます

分類Dev

ステンシルバッファを使用してオブジェクトの輪郭を描くと、間違った結果が得られます

分類Dev

GLM:vec3に3x3変換行列を掛けると、奇妙な結果が得られます

分類Dev

関数の結果をセッションに保存すると、TypeErrorオブジェクトがJSONシリアル化できなくなります

Related 関連記事

  1. 1

    あるオブジェクトを別のオブジェクトにコピーすると、Javaで異なる結果が得られます

  2. 2

    Java文字列オブジェクトのサイズを計測すると不正な結果が得られる

  3. 3

    2つのNSDateオブジェクトの同等性を比較すると、予期しない結果が得られます

  4. 4

    ベクトルとxtsオブジェクトに適用すると、ks.boot出力で異なる結果が得られるのはなぜですか?

  5. 5

    javascript:オブジェクトの配列を並べ替えると、一貫性のない結果が得られます

  6. 6

    PHP-エンコードされたオブジェクト配列から奇妙な結果が得られるのはなぜですか?

  7. 7

    Paperjsが長方形にセグメントを挿入すると、奇妙な結果が得られます

  8. 8

    Pythoncairoが図をnp配列として保存すると奇妙な結果が得られます

  9. 9

    分類すると奇妙な結果が得られます

  10. 10

    空のオブジェクトで空の配列を追加すると、オペランドを反転したときに異なる結果が得られます

  11. 11

    stdinから整数を読み取ると、奇妙な結果が得られます

  12. 12

    毎日の最大値を取得すると、奇妙な結果が得られます

  13. 13

    カスタム関数の後、Rコンソールでオブジェクトを呼び出すと目的の結果が得られますが、環境からオブジェクトを「表示」することはできません。

  14. 14

    lang cssディレクティブを使用してフォントサイズを縮小すると、奇妙な結果が得られます

  15. 15

    スタックオブジェクトとヒープオブジェクトでTimes(n)を指定してgmock EXPECT_CALLを呼び出すと、異なる結果が得られるのはなぜですか?

  16. 16

    BeautifulSoupでページをスクレイピングすると、奇妙な結果が得られます(最後に複数</ p>)。どうして?

  17. 17

    mysqlのテーブルを更新すると奇妙な結果が得られます

  18. 18

    空のサブクエリで SELECT IN を実行すると、奇妙な結果が得られる

  19. 19

    Optaplannerプロジェクトのジョブスケジューリングの例を実行しますが、異なる結果が得られます

  20. 20

    パーセク:動作中のパーサーを拡張すると、奇妙な結果が得られます

  21. 21

    UWP:RichTextBlockでテキストの高さを計算すると奇妙な結果が得られます

  22. 22

    Cでlongdoubleを使用すると、減算後に奇妙な結果が得られます

  23. 23

    配列からオブジェクトにランダムな値をコピーしても安定した結果を得ることができません

  24. 24

    moqdbオブジェクトで結果が得られないのはなぜですか

  25. 25

    クラスインスタンスディクショナリにオブジェクトを保存すると、予期しない結果が発生します

  26. 26

    RamdaJS:オブジェクトを作成すると、同じ「ランダム」な結果が生成されます

  27. 27

    ステンシルバッファを使用してオブジェクトの輪郭を描くと、間違った結果が得られます

  28. 28

    GLM:vec3に3x3変換行列を掛けると、奇妙な結果が得られます

  29. 29

    関数の結果をセッションに保存すると、TypeErrorオブジェクトがJSONシリアル化できなくなります

ホットタグ

アーカイブ