【初心者歓迎】C/C++室 Ver.104【環境依存OK】
レス数が1000を超えています。これ以上書き込みはできません。
エスケープシーケンスやWin32APIなどの環境依存なものもOK
そのような質問は必ず環境を書きましょう
半角空白やタブでのインデントはスレに貼ると無くなります
コードを貼れる所
http://codepad.org/
https://ideone.com/
前スレ
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/ >>947
>例えばそのページでは、例外安全性を考慮していないコードのリスク、つまりリソースリークについて書かれてますがリターンコード形式でも解放を忘れればリークするのは同じことです
そこで exception の実装に話が戻るのです
exception の実装(例えば sjlj, seh のどちらかひとつでいい)はどうしても(隠れたところに)グローバル変数を必要とするのではないですか?
これはスレッドセーフや例外安全を考えるときに、大きな癌になりうるでしょう
一方、return-value 方式は、頑張ればローカル変数だけで記述できる
return-value 方式の方が考えるのが楽ではないですか?
>自分で考えずに権威を盲信する人を文系と揶揄することがありますがもしかしてあなたも文系なのでしょうか?
かりにそうだったとしても最初は「新しいものはいいものだ」で押し通そうとした、あなたには言われたくないですね… >>949
例外の場合
T val = f(...);
エラーコード場合
T val;
int ret = f(..., val);
if (is_error(ret)) return ret;
最小だとこの程度でしょう
とはいえ膨大なコードベースになるとこれだけでもうんざりしますが >>948
その例外の上位への素通し、って、確かに >>936 では私も例外の利点だと書いてしまいましたが、でも実際には嫌われることなんではないですか?
java は下位ルーチンが発生させる例外(のうちのある種類)は、上位側で catch しとかないとコンパイラが怒るんではないでしょうか? 嫌われないよ
RAIIじゃない場合
一度キャッチしてリソース解放したあとスローし直さなきゃリソース漏らすというだけ >>956
なるほど、だとすると、>>936 で書いた「exception の発生した階層から遠く離れたところでも、その exception を catch」できる、というのは無条件では c++ では利点にならないですね、return-value 式とほとんど変わらない… >>952
たとえグローバル変数を使った実装だったとしても例外の利用者にとっては透過的なので問題はありません
スレッド処理でも問題はありません
同じスレッドでは利用者は何も気にせずに例外使えます
スレッドを結合するところでは例外を転送してください
そのための標準的な方法も用意されています
エラーコード形式の場合はスレッド間転送も標準のない独自形式になるのでより難しそうですね >>954
Javaには例外時に自動でリソースを閉じるための構文が存在しない時期がありました
検査例外はそのときの名残です
GCされるまで自動で閉じられることはないからちゃんと手動で解放しろと注意喚起する意味では検査例外にも価値があります
逆に言うとRAIIやusing/IDisposeのような機構が適切に使われている場合はうっとおしいお節介でしかないわけです
ちなみにリターンコード形式場合はリソースを確保していない場合でも定型処理を書かなければなりません
したがってそのうっとおしさは検査例外とは比較にならないほどの負担になります いつもはうっとうしいQZ某が、今日は概ね論理的な物言いをしているように感じる。
対する例外推しの彼は、饒舌だが自説を貫こうとするだけで相手を納得させるような説明はしようとせず、議論をしていつもりで議論できてない人のように見える。リアルなフォーク准将を見ているような気持ち悪さがあるよ。
ちなみに俺は例外も戻り値も適材適所で使い分けて一貫性がとれていればいいんじゃね、という意見だけど、議論に加わる気は無いのでスルーしてくれ。 納得させる気は最初からないからね
ただ単に事実を語っただけ 機械学習とかアプリケーションレイヤの開発をしてて普段はJavaとかpythonで書いてるんだけど相談。
手間や保守を考えるといくら早く動作しても全部cで実装は厳しくて、複雑な計算とかだけcに渡そうと思うんだけど、このレイヤだとそんなもんだろうか?実際の仕事での使われ方の例があれば教えてほしい。 例外安全という言葉には色々と含まれるけど、
とりあえず最低限度の保証としては「リソースリークが起こらないこと」とすると、
C++ ではデストラクタで後始末するのが基本だ。
(RAII)
私が強調しておきたいのは、リソース管理の配慮はクラス定義に押し込めることが出来るということと、
可能な限り押し込めるべきだということ。
エラー発生の通知に使うのが返却値であれ例外であれ、
エラーへの対処の中にリソース回収のコードを書かなきゃならないようならその時点でダメなコードだ。
デストラクタで回収されることをあてにしたい。
(bad_alloc のような致命的なやつはちょっと話が違ってきたりとか、単純ではない場面はあるけど……。)
で、デストラクタでリソースを後始末するというのが出来ているという前提であれば、
例外を使うか返却値を使うかの差は対処のためのコードをどこにかくかの違いに過ぎなくなる。
Java と違って関数が送出する例外を型システムで管理してくれないわけだし、
引数をチェックしているかどうかもプログラマが気を付けるしかないので、そんなに違いはないと思う。
違いはないがどちらかに一貫させるのが望ましいと考えると、
C++ の基本的なライブラリに併せるべきだということになって例外を使うのが妥当という判断になる。
ちなみにグーグルのガイドラインが例外を避けることになっているのは
グーグルで使っている既存のコードが例外への配慮を充分にしてないから
やむを得ずそれに合わせるためでフルスクラッチに出来れば違う判断をするかも
ってことも書いてあるので、例外を避ける根拠としては弱い。 >>960
>いつもはうっとうしいQZ某が、今日は概ね論理的な物言いをしているように感じる。
あれ?れれ?
おっかしーなー、私もプログラムを書く人だし最低限自分の作ったバグくらいはさっさと片付けたいので、そのためにも、いつも論理的でありたいと願っているのですが… そういうとこだよ
こういうのってたいてい本人は自覚してないもんだからやっかい >>963
>違いはないがどちらかに一貫させるのが望ましいと考えると、
>C++ の基本的なライブラリに併せるべきだということになって例外を使うのが妥当という判断になる。
この意見に対しては私は痛烈な批判を浴びせることになるでしょう
曰く、C/C++ の人なら言語的な統一感よりもコスト、というか単純性を優先したくなるのではないですか?
UML のグジャグジャ感をみるにつけても、「言語法律家」なるものはきわめて忌むべき存在と私は考えています
exception を実装するためには、隠れグローバル変数をどうしても準備しなければならない
シングルコアで exception の履歴を単一スタックに全部のせることができるのなら、ローカルで sjlj を駆使して、あるいは書き手からみえないところで純ローカル変数的世界に納めることもできたかもしれませんが、
今やマルチコアで実際に複数のスタックとプログラムカウンタが走る時代で、exception の実装は OS に丸投げの複雑怪奇、ついでにコストも複雑怪奇でパンピーには理解が及ばない…
そんな巨大かつ複雑なスケールの実装を必要とするのに見合った exception のメリットは何か、今も自問自答を繰り返しているのです 単純さを選んだら例外になったというお話だったのさ。ちゃんちゃん なぜsjljにこだわるのか
コルーチンとか標準化されても使わなそうだな c++の言語仕様に例外の実装にはグローバル変数使えとかSJLJ使えなんて縛りあったっけ? >>971
実装方法までは言語仕様に記述されないでしょうね… >>972
ということは例外の実装にまで踏み込んで考えるのはナンセンスなのでは? ちなみにおれはc++の例外は大規模開発でworkしないと思ってるから
経験上ひたすら面倒な事態になる
言語仕様決めてるやつらは言語オタクで大規模開発の経験ないと思ってる >>968
いつの話をしてるんだよ。 モダンな環境では例外送出の実行コストは充分に小さい。
特別な環境で特別な対処をしなきゃならない場合を例に出しても意味がないぞ。
ふーん、そういう場合はそうするんですねとしか言いようが無い。 >>976
sjljでない場合
例外がおこらない分にはオーバーヘッドないけど、起こったときのスタック巻き戻しが重い
こういうこと知らずにクリティカルなとこで気軽に例外発生させるバカをよく見る 抽象化ができずどんな粒度でも低級のセオリーを通そうとする
早すぎる最適化がとにかく大好き
C++erに多いねこのタイプ >>978
アホみたいにmap使いまくって後でひどい目に遭うアホもよく見るな >>980
それが必要なのってC++コード全体からすると何パーセントくらいなの? >>982
しらないけどクリティカルな処理ないならc++使わなくていいんじゃないの
なんでわざわざこんなしんどい言語使う? >>981
別にmap使いまくってもいいよ
ちゃんと抽象化しとけば後でチューニングするのは簡単だから >>984
まさかw
データ構造大事だよ初心者さん 合ってるね
スクリプト言語あがりと一緒に仕事すると高い確率でそうなる
同じ事をいうんだよ
最初は抽象度高く作ってあとで最適化って
結局しないからね
だいたい薄く広く積もったオーバーヘッドは表面化しないから
んでもっさりアプリの出来上がり
であとで精鋭集めて作り直し >>988
そこで作り直すから低スキルなんだよな
前任者がせっかく変更に強いシステムを組んでやったのに台無しにするんだ >>989
変更に強いとかの内輪の都合よりUXの方が大事だよ
初心者さん >>990
その大事な大事なUXを向上させるために抽象化するんだよ新人君 さすがにそれは意味不明では?
過剰なオブジェクト指向でダメになったプロジェクトは数知れず そういうのいいから
説明できないならそこでおしまい UXの向上にはフィールドバックと変更のループが必要
度々の変更を容易たらしめるためには適切な抽象化が必要
最初から速度最適化に傾倒して抽象性を失ったシステムは変更しにくいゴミUXを抱え続ける 御託ご苦労さん
でそれどっからの流れなの?
お前さんに一度map乱用ボトルネックを一晩でtableに置き換える作業やらせてみたいわ
多数のモジュールと繋がってるやつな
最初から見積り立てて設計しとけよボケってどなられるやつな >>977
そりゃあクリティカルなところという特別な場合には特別扱いが必要ですねって
だけのことで、そんなこともわからんやつは例外を使おうと使うまいと駄目だよ。 このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 116日 18時間 38分 57秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。