問題タブ [gotw]
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++ - GotW 54で作品をリサイズ&クリアしてみませんか?
HerbSutter の記事Gotw 54を参照して、彼は次のように説明しています。
ベクターまたは両端キューを「縮小して合わせる」正しい方法と
ベクターまたは両端キューを完全にクリアする正しい方法
container.resize()
上記のタスクにandを使用できますcontainer.clear()
か、それとも何か不足していますか?
c++ - Gotw 67 の例
http://www.gotw.ca/gotw/067.htmに例があります
double を float に変更すると、VS2008 では無限ループになります。ゴウの説明によると:
float が 0 から 1e8 までのすべての整数値を正確に表現できない場合はどうなるでしょうか? その後、変更されたプログラムはカウントダウンを開始しますが、最終的には表現できない値 N に到達し、 N-1 == N (浮動小数点の精度が不十分なため) になります...そして、ループはスタックしたままになります。プログラムが実行されているマシンの電源がなくなるまで、その値で。
私が理解していることから、IEEE754 float は単精度 (32 ビット) であり、float の範囲は +/- 3.4e +/- 38 であり、有効桁数は 7 桁である必要があります。
しかし、私はまだこれがどのように起こるのか正確には理解していません. 誰かがこのビットを説明しようとすることができますか?
少し追加情報: double x = 1e8 を使用すると、約 1 秒で終了しました。float x = 1e8 に変更すると、はるかに長く実行されます (5 分後も実行されます) float x = 1e7;
。 1秒くらいで終わりました。
私のテスト環境は VS2008 です。
ところで、基本的な IEEE 754 形式の説明は、既に理解しているので質問していません。
ありがとう
c++ - gotw 80 構文 - パラメーター リストでの初期化
Gotw 80には、次の例が含まれています。
この記事では、s = f()
オブジェクトの有効期間と作成順序が原因で、行が正しくない理由について説明します。この記事では、当時、エラーはコンパイラによって検出されなかったと述べています。
ただし、初期化の順序とオブジェクトの有効期間の問題を無視するとs = f()
、コンストラクターのパラメーターリストで構文的に合法になる方法がわかりません-パラメーターリストでメンバーを初期化しようとしているようです(またはおそらくデフォルトを宣言しています)価値)。この構文が何をしようとしているのか、誰か説明できますか?
c++ - GotW #101「ソリューション」は実際に何かを解決しますか?
まず、C++11 の pimpl に関する Herb の Sutters GotW の投稿をお読みください。
GotW #101 で提案されている解決策を理解するのに苦労しています。私が理解できる限りでは、GotW #100 で苦労して解決されたすべての問題が復讐をもって戻ってきました。
メンバは標準外の
pimpl
テンプレートであり、定義は使用時に表示されません (class widget
のクラス定義および の暗黙的に生成された特別なメンバ関数widget
)。明示的なインスタンス化もありません。これにより、リンク中に未解決の外部エラーが発生します。widget::impl
インスタンス化が定義されている時点ではまだ不完全pimpl<widget::impl>::~pimpl()
です(実際にはインスタンス化されているとは思いませんが、参照されているだけです)。そのため、不完全な型へのポインターを呼び出します。自明でないデストラクタがある場合、未定義の動作が発生します。std::unique_ptr<widget::impl>::~unique_ptr()
delete
widget::impl
widget::impl
完全なコンテキストでコンパイラが特別なメンバーを生成するように強制する理由を説明してください。仕組みが見えないからです。
GotW #101 がまだ完全なwidget::~widget()
実装ファイルでの明示的な定義を必要とする場合widget::impl
は、「より堅牢な」コメント (@sehe が回答で引用したもの) について説明してください。
ラッパーが「ボイラープレートの一部を削除する」という GotW #101 の中心的な主張を見ていますが、これは (段落の残りの部分に基づいて)widget::~widget()
宣言と定義を意味しているように思えます。ですから、GotW #101 では、それはなくなっています。
ハーブさん、お立ち寄りの際は、参照用にここにソリューション コードをカット アンド ペーストしてもよろしいかどうかお知らせください。
c++ - C++ の最も面倒な解析が再び
http://herbsutter.com/2013/05/09/gotw-1-solution/から直接取得
widget w();
私には明らかですが、以下のコードが関数宣言になる方法がわかりませんか?
これはどのように可能ですか?
c++ - 今週のグルの理解 #67: ダブル オア ナッシング
最近、私は投稿を読んでいました: Herb Sutter による GOTW からの Double or Nothing 以下のプログラムの説明に少し混乱しています:
このコードが、あるマシンで 1 秒間実行されると仮定します。このようなコードはばかげているという点には同意します。
ただし、x
からfloat
に変更した場合の問題に関する説明によるdouble
と、一部のコンパイラでは、コンピューターが永久に実行され続けます。説明は、標準からの次の引用に基づいています。
C++ 標準のセクション 3.9.1/8 からの引用:
浮動小数点型には、float、double、long double の 3 つがあります。double 型は少なくとも float と同じ精度を提供し、型 long double は少なくとも double と同じ精度を提供します。float 型の値のセットは、double 型の値のセットのサブセットです。double 型の値のセットは、long double 型の値のセットのサブセットです。
コードの質問は次のとおりです。
「double」を「float」に変更すると、どのくらいの時間がかかると予想されますか? なんで?
与えられた説明は次のとおりです。
float が 0 から 1e8 までのすべての整数値を正確に表現できるかどうかに応じて、おそらく約 1 秒 (特定の実装では、float は double よりも速いか、同じくらい速いか、または遅いかもしれません) かかるか、永遠にかかります。
上記の標準からの引用は、double で表現できるが float では表現できない値が存在する可能性があることを意味します。特に、一部の一般的なプラットフォームやコンパイラでは、double は [0,1e8] のすべての整数値を正確に表すことができますが、float はできません。
float が 0 から 1e8 までのすべての整数値を正確に表現できない場合はどうなるでしょうか? その後、変更されたプログラムはカウントダウンを開始しますが、最終的には表現できない値 N に到達し、 N-1 == N (浮動小数点の精度が不十分なため)...そして
私の質問は:
float が を表すことさえできない場合1e8
は、初期化時にすでにオーバーフローが発生しているはずfloat x = 1e8
です。では、どうしてコンピュータを永遠に動かすことができるのでしょうか?
ここで簡単な例を試しました(そうではありませんdouble
がint
)
これは、コンパイラが指定された数値をint
型で表現できない場合、オーバーフローが発生することを意味します。
じゃあ読み間違えた?私が逃したポイントは何ですか?x
から未定義の動作に変更されdouble
ていますか?float
ありがとうございました!
c++ - この典型的な例外の安全でないコードを修正するにはどうすればよいですか?
GOTW #56によると、次のコードには、潜在的な従来のメモリ リークと例外の安全性の問題があります。
その理由は、 we new T1
、またはnew T2
の場合、クラスのコンストラクターから例外がスローされる可能性があるためです。
一方、説明によると:
簡単な要約: 「new T1」のような式は、単純に new-expression と呼ばれます。new-expression が実際に何をするかを思い出してください (ここではあまり関係がないため、簡単にするために配置と配列の形式は無視します)。
メモリを割り当てます
そのメモリに新しいオブジェクトを構築します
例外のために構築が失敗した場合、割り当てられたメモリは解放されます
したがって、各 new 式は基本的に一連の 2 つの関数呼び出しです。1 回の operator new() への呼び出し (グローバルなもの、または作成されるオブジェクトの型によって提供されるもの) と、コンストラクターへの呼び出しです。
例 1 について、コンパイラが次のようにコードを生成することを決定した場合に何が起こるかを考えてみましょう。
1: T1 にメモリを割り当てる
2: T1 を構築する
3: T2 にメモリを割り当てる
4: T2 を構築する
5: f() を呼び出す問題は次のとおりです。ステップ 3 またはステップ 4 のいずれかが例外のために失敗した場合、C++ 標準では、T1 オブジェクトを破棄してメモリの割り当てを解除する必要はありません。これは典型的なメモリ リークであり、明らかに良いことではありません。[...]
続きを読む:
クリーンアップに関しては、コンパイラに正しいことを行うように要求することによって、標準が問題を防止しないのはなぜですか?
基本的な答えは、気づいていなかったということです。気づいた今でも、修正するのは望ましくないかもしれません。C++ 標準では、コンパイラが式の評価順序にある程度の自由度を与えることができます。これにより、コンパイラは、他の方法では不可能な最適化を実行できるからです。これを可能にするために、式の評価規則は例外セーフではない方法で指定されているため、例外セーフなコードを書きたい場合は、これらのケースについて知って回避する必要があります。(これを行う最善の方法については、以下を参照してください。)
だから私の質問は:
この典型的な例外の安全でないコードを修正するにはどうすればよいですか? このようなコードを書くことを単に避けるべきでしょうか?
答えは私を少し混乱させました.コンストラクターの失敗を処理するために、C++ FAQに従ってコンストラクターから例外をスローし、割り当てられたメモリが適切に解放されることを確認する必要があります.上記のコードにまだ例外の安全性の問題がありますか?
お時間をいただき、ありがとうございました。
c++ - GotW #53 で著者が言おうとしていることは何ですか?
この疑似コードは、"A Not-So-Good Long-Term Solution" というサブタイトルでGotW #53から入手したものです。特に以下の「//エラー:潜在的...」で始まるコメントに関連して、著者が言っていることをすでに数時間理解しようとしましたが、役に立ちませんでした。これについて何か助けていただければ幸いです。