問題タブ [temporary-objects]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - テンポラリーを使用してイテレーターを STL コンテナーに取得する際の微妙なエラー: どうすれば回避できますか?
このクラスを考えてみましょう:
そしてこのバグのあるコード:
間違った部分は、Statement 1
andStatement 2
で、各ステートメントの最後に破棄される一時オブジェクトへのイテレータを取得していることです。その結果、for()
ループ内の動作は未定義です。
メソッドの正しい使用getTheMap()
法は次のとおりです。
X
クラスにはいくつかの重大な設計上の問題があることに注意する必要があります。
_map
クラス内に(読み取りアクセスと書き込みアクセスの両方で)より適切にカプセル化する必要があるため、getTheMap()
メソッドを回避できます- メソッドが本当に必要な場合は
getTheMap()
、への参照を返すことができます。_map
ただし、クラス X が「そのまま」(<-- 以下の編集を参照) の場合、ユーザーがイテレータを一時的に取得できないようにする方法はありますか?
編集: クラスX
は変更できますが、getTheMap
メソッドが存在し、値によって返される必要があります。ただし、コンパイラの警告についても考えていました。
c++ - 一時的な代入と参照の初期化
私は次のものを持っているとします:
最後の行には次が含まれます。
- の一時的に構築されたインスタンス
someValueType
- 新しいマップ エントリへの一時的な割り当て
- マップ エントリへの参照の初期化
したがって、次の行が次の場合:
これはマップエントリを正しく変更しようとしますか? 元の一時的ではありませんか?
この場合、非 const であるために参照が一時的に取得できないかどうかはわかっています (したがって、コンパイラ エラーまたは 1 つがない場合、私の質問に答えることができます) が、const を参照宣言に追加した場合、そうではありませんこの場合、評価ルールが何を言うかを確認してください
c++ - 関数から返される一時オブジェクトは常に右辺値とは限りませんか?
出力:コピー
*f()
は明らかに匿名の一時オブジェクトであるため、r 値である必要があり、move-constructor を呼び出す必要があります。コンパイラが左辺値として扱うのはなぜ*f()
ですか?
コンパイラのバグなのか、私の理解が間違っているのでしょうか。
c++ - 一時的なオブジェクト-それらはいつ作成されますか、コードでどのように認識しますか?
Eckel、Vol 1、pg:367
なぜf5() = X(1)
成功したのですか?ここで何が起こっているのですか?
Q1。彼がそうするときX(1)
-ここで何が起こっているのですか?これはコンストラクター呼び出しですか?これを読んではいけませんX::X(1);
か?それはクラスのインスタンス化ですか-クラスのインスタンス化は次のようなものではありません:X a(1);
コンパイラーはどのように何
X(1)
であるかを判別しますか?つまり、名前の装飾が行われるのでX(1)
、コンストラクター呼び出しは次のように変換されます:globalScope_X_int
関数名として.. ???
Q2。確かに、一時オブジェクトは、X(1)
作成された結果のオブジェクトを格納するために使用され、その後、オブジェクトf5()
リターンに割り当てられませんか(これも一時オブジェクトになります)?それがすぐに破棄される一時オブジェクトをf5()
返すとすると、彼はどのようにしてある定数一時変数を別の定数一時変数に割り当てることができますか?誰かが理由
f7(f5());
を明確に説明できますか?f5();
c++ - temp を const ref メンバーに割り当てると、セグメンテーション違反が発生します
例でよりよく説明します:
tok.h
main.cpp
プログラムは間違っている 0 を出力します。実際のコードでは、セグ フォールトが発生します。
ここでは、const 参照に割り当てられた temp の寿命を延ばすという規則が成り立つと思いますが、明らかにそうではありません。その理由を知っていますか?
c++ - 仮想マシンでの余分なストア/ロードを回避するために、一時オブジェクトをレジスタに保持しますか?
タイトルが少し不明確かもしれないので、ここに説明があります:
問題:
私の実装では、これら2つの「指示」に解決されます
私は現在、一時オブジェクトを使用して一時値を格納しています。これにより、一時値をRAMに格納し、必要なときに再度フェッチする必要があります。どちらも実際には必要ではなく、パフォーマンスが低下します。
私はVMをC++で実装しているので、私の質問は、一時的な値のメインメモリへの保存を回避し、実際のCPUレジスタに保持するための移植可能な方法があるかどうかです。
キーワードを使用していくつかのテストを行いましregister
たが、パフォーマンスが向上していないことから判断すると、コンパイラはそれを無視していると思います。
最後の手段として、プラットフォーム固有のアセンブリに進んでいきますが、この件についてはほとんど暗闇に包まれているため、これが唯一の可能な方法である場合は、適切な情報を歓迎します。私が示したこの例は基本的なものであり、多くの一時オブジェクトが必要になる状況に遭遇する可能性が高いことを私は理解しています。その場合、使用および使用するレジスタの量を決定する方法が必要です。残りのメモリストレージ...
おそらく、レジスタストレージを要求する方法があり、コンパイラがレジスタを「使い果たした」場合、一時的なものをスタックに自動的にプッシュしますか?私がアセンブリに精通している限り、あなたは特定のレジスタをその名前で「アドレス指定」しますが、コンパイラが潜在的なレジスタ使用の競合をどのように正確に処理するかはわかりません...
select - SQLのSelect文に一時的に値を格納できますか?
私の select ステートメントには、計算である 2 つの戻り値があります。次のようになります。
select にこれら 5 つのステートメントを入力したら、E-Premium + F-Premium を新しい列に合計できるようにしたいと考えています。私はいつもこのようにすることができました:
...しかし、それはかなりずさんでかさばるようです。簡単にできるように、個々の保険料を保存する方法はありますかCAST((F-Premium + E-Premium) AS DECIMAL(38,2)) 'Total Premium'
かさばる方法では、F-Premium と E-Premium が動的のままにならないため、それらの計算方法を変更した場合は、Total Premium 列の計算も変更する必要があります。
Microsoft SQL Server Management Studio 2010 の使用
c++ - 参照パラメーターに一時的にバインドされた既定の引数の有効期間はどれくらいですか?
参照は一時オブジェクトの有効期間を参照自体の有効期間に延長するだけだと思いましたが、次のスニペットの出力は矛盾しているようです:
実例。出力:
だから、呼び出された後に一時的に破棄されたようg()
です...何が得られますか?
c++ - 一時オブジェクトを返す C++ の混乱
かなり基本的な C++ の質問があります。いくつかの入力パラメーターを受け取り、std::string
それらのパラメーターから次のようなを作成する関数を考えてみましょう。
stringstream
関数が戻るときにオブジェクトがスコープ外になることは理解していますが、それによって構築された文字列も無効になりませんか?
const char *
戻り値の型を に変更して返すとどうなりss.str().c_str()
ますか?
上記のようなコードは機能しているように見えますが、それは単に「一時」オブジェクトを含むメモリが使用時に別のものでまだ上書きされていないためではないでしょうか?
私は認めざるを得ませんが、一般的にそのような状況ではかなり混乱しています。誰かがこの「一時的なオブジェクト」全体を説明してくれれば (または、正しい方向に向けてくれれば) ありがたいです。
c++ - 一時オブジェクトの作成
C ++準拠のコンパイラ(Visual Studio、g ++など)で任意の種類のログを有効にして、一時オブジェクトがいつ作成されるかを検出できるかどうかを誰かが知っていますか?
例えば:
関数があるとしましょうが、これを次のf(char x)
ように呼び出しますf(46)
ログに表示されます-
temporary char created promoting int @ function param f(46)
(またはこのようなもの)
VSコンパイラのスイッチオプションを読みましたが、これはオプションではないようです。
新しい標準には、移動セマンティクスのほとんどの一時的なものを検出するために使用できる(&&)の概念があることを理解していますrvalue reference
が、これには新しいコード/準拠コンパイラの追加が含まれます。
それで、これはできますか?それとも、コンパイラに関するこの特権的な知識ですか?