C++相談室 part151

■ このスレッドは過去ログ倉庫に格納されています
2020/05/14(木) 11:53:25.59ID:ZPCfyTux
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part150
https://mevius.5ch.net/test/read.cgi/tech/1584975873/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

テンプレここまで
2020/06/09(火) 16:12:25.38ID:SETbyCsO
>>256
もし、CTRL+Sを処理するイベントハンドラの中で、単純に CloseHandle()を自分で呼び出して
失敗した場合であれば、保存に失敗した事をAfxMessageBox()で知らせた後、なんとか今までの
メモリ中のデータだけは壊さずに処理できればベスト。

しかし、他の何らかの例外が発生した時に、RAIIによって自動的に呼び出されたデストラクタの中で
CloseHandle()に失敗した場合には、対処が難しそう。
テストも難しいし、余りそういう状況は起きないので優先順位は低いが。
2020/06/09(火) 17:15:04.89ID:nNNGB7r+
>>260
std::pair<int, SomeObj> を格納するコンテナと
「int部分とある値とのビットORを結果とする述語」を
std::copy_if() に渡すような話かな。

「任意オブジェ」部分が要素ごとに異なる、だと難問な気がするけど。
2020/06/09(火) 17:30:16.71ID:n28tZ6EV
論理積ではなく?
2020/06/09(火) 17:42:20.88ID:nNNGB7r+
確かに論理和だと「つまらない」結果になりそうね。
普通の使い方なら論理積で抽出か。

排他的論理和は「もっと面白い」かも知れんけど。
2020/06/09(火) 22:35:23.41ID:FUnSNOef
>>262
それで組んでみます
ありがとうございました
あと実際は論理積です
2020/06/10(水) 05:39:12.94ID:67cF/bBY
>>256
「ログファイルなので書込みに失敗しても大勢に影響が無い」とか
「作業用ファイルfは書いた後必ず誰かがリードオープンするから書込みに失敗していたらそこでワカルから書込みのエラーチェックを省略する」
みたいな判断はアプリの設計としてはアリかもしれないが、CMyHandleみたいな汎用部品的に使われ得る低水準クラスではナシ
これをアリだと思う香具師はお気楽すぐる、
2020/06/10(水) 05:44:30.52ID:OTs8rmHM
>>266
でも >>256 の CloseHandle() や fclose() が失敗したからといって、何か手が打てるのですか?
何もできないのでは?
もしかして黙って exit() するのですか?
2020/06/10(水) 07:23:10.62ID:itI4VuCe
てか、自動解放するクラス作っても手動解放する手段残しておけば、使う側で特別な処理は出来るんだよね
2020/06/10(水) 08:13:57.83ID:V+CQutVh
C++ではexitをD組にして欲しい
2020/06/10(水) 12:31:11.80ID:BPKUZfdj
>>267 通知は欲しいかな。
黙って動作が続くくよりは terminate() のほうがマシだとも思うし。汎用部品ならなおさら。

破棄失敗する可能性のあるリソースの RAII wrapper にはエラー通知できる
close() なりの破棄操作を別に用意しておけという話で済むと思う。
2020/06/10(水) 21:10:53.11ID:OTs8rmHM
>>270
通知って簡単にいいますけれども、その例えば fclose() 失敗の通知をどこに送り、そして送った先では何をするのですか?
通知をもらって何か手を打てるのですか?

汎用部品/ライブラリの作法ですか
理解はできますが、しかし、何もできないのなら、あるいは何もできないことがわかっているのなら、特段の失着にはみえませんね…
2020/06/10(水) 21:56:31.91ID:yfneRFZn
大事なデータを保存したファイルのfclose()が失敗したらどうするかって?
場所変えて保存を試みるに決まってるだろ
それくらいしないプログラムは売り物にならないぞ
2020/06/10(水) 22:20:00.38ID:yQDU6thd
そもそも仕様で指定があるならそのように書くだけなんじゃ
2020/06/11(木) 00:27:51.81ID:flOLYJrB
>>271
たとえばコンソールアプリなら標準エラーに情報を出したうえで終了コードに反映して、
コマンドが失敗したのを見たユーザーが何をするか考えるっていうのはごく当たり前のことでしょ。
たとえばストレージ容量が足りないとして失敗したなら容量を確保して再実行すればいい。

fclose() の戻り値を捨ててるプログラムは現実としてたぶん多いんだけど、
そんなソフトがたとえばサーバー内でストレージ容量不足を数か月にわたって闇に葬り続け、
何かおかしいと気付いたサーバー管理者が自動スクリプトを緻密にトレースした結果、
保存されているはずの情報がもはやどこにも存在しないと気付いた時の怒り憎しみ悲しみを想像されたい。

少なくとも成功したと誤解しないのが重要。
275デフォルトの名無しさん
垢版 |
2020/06/11(木) 06:18:34.85ID:m7gaY4Qp
そんな状況じゃopenも失敗してるだろうな
2020/06/11(木) 09:58:48.19ID:Th6rh/3U
>>274
実はそれがRAIIの限界なんだよ。

ちゃんと明示的に fclose() してその戻り値をチェックするのが一番安全。
例外安全性のためにRAIIを使うべきという人が居るけど、それで勝手に
デストラクタ内でfclose()して容量不足やディスクエラーで書き込み失敗した時には、
多くの場合、対処に困る。
でも、例外安全のためにはそうせざるを得ないかも知れない。
ということは、そもそも論になり、例外の throw、catch機構自体が安全に扱うのが
難しいという結論に至り、議論百出する。
2020/06/11(木) 10:29:20.16ID:flOLYJrB
>>276
それは飛躍しすぎかな。
破棄が失敗する可能性のあるリソースの RAII ラッパーが破棄操作も提供すれば済む話でしょ。
std::fstream の close() みたいに。
2020/06/11(木) 10:38:30.62ID:3eiGl155
上から目線なくせに脇が甘いな
2020/06/11(木) 11:08:58.38ID:7wv0rqaB
デストラクタ内でエラーが発生する可能性があってそれに対処が必要なら
例外の送出とか言ってないでデストラクタ内で対処してしまえよ。
汎用的な部品にし難いのはしゃーないやろ。
実際に汎用的ではないんだから。
280デフォルトの名無しさん
垢版 |
2020/06/11(木) 11:47:39.02ID:DcPEy/qZ
おまいら (f)printf() の戻り値もちゃんと毎回観てるか?
2020/06/11(木) 11:54:46.87ID:Th6rh/3U
>>279
そうじゃなくて、何らかの別の事情で例外が送出された時に、fclose()し忘れを
防ぐためにRAIIのテクニックを使う場合の話をしてる。
2020/06/11(木) 11:56:16.72ID:Th6rh/3U
>>277
fstreamであろうがなんであろうが、GUIアプリに置いて、デストラクタ内で失敗した
時にユーザーに失敗したことを知らせるのは結構難しいぞ。
2020/06/11(木) 12:17:49.27ID:3eiGl155
そんなに難しいか?
深刻な事態が疑われるならシステムモーダルダイアログなり何なりすることあるだろ
あくまでOSではなくアプリとして事後条件が保証できない場合はterminateを呼び出して
OSに事故としての扱いをさせるのが「難しい」のは思いつかないだけじゃねえだろな

プログラミング以外の仕事でも事故はまず報連相
1人で握りつぶそうとするのは学生気分が抜けてないやつのすることだ
2020/06/11(木) 12:19:04.03ID:flOLYJrB
>>282
そりゃ難しいだろうな。
通知が要るならデストラクタ内で失敗させないように破棄操作を提供すれば済むだろうという話をしたつもり。
それで済まないケースを想定してるなら、どんなのか教えて。
2020/06/11(木) 12:21:07.06ID:flOLYJrB
>>283 そっか GUI ならダイアログ使えるから、通知するだけなら簡単だね。
2020/06/11(木) 12:22:43.78ID:Th6rh/3U
>>284
>通知が要るならデストラクタ内で失敗させないように破棄操作を提供すれば済むだろうという話をしたつもり。
意味が分からないので、説明を。
2020/06/11(木) 12:29:07.29ID:Th6rh/3U
>>283
Exceptionをthrowした時の自動フォローアップとしてRAIIのデストラクタが呼び出される。
それが呼び出されるのは原則的にどこかでかは余り仮定できない。
ということは、非常に変なタイミングで fclose()に失敗することがある。
メッセージボックスを出すと、そこでイベントに対するメッセージループが形成されるので、
タイマーイベントのハンドラのOnTimer()などが起動してしまうこともある。
OnTimer()を、Exceptionがthrowされた状態で実行してよいかどうかは注意を要する事だ。
また、アプリの初期化処理の InitInstance()や終了処理のExitInstance()の中で、RAIIの
デストラクタが呼び出されてしまう場合もあるかも知れず、その中でメッセージボックスを
出すと思わぬ問題が生じるかもしれない。
生じないかも知れないが。

ただ、Exceptionがthrowされたということは何か異常が生じているということで、
それがたまたまファイルに関するものであったとしたら、二重三重に、ファイル関連で
エラーが生じてしまい、何か危険な状態に陥ってしまう可能性も有るかも知れない。
そういう微妙な配慮が必要となる。
2020/06/11(木) 12:33:42.17ID:Th6rh/3U
>>287
もっといえば、Exceptionのthrowはどこで起きるかは仮定しにくいものなので、
何らかのダイアログを出すための初期化処理の中で生じることも有るかも知れない。
そういう場合にたまたま、関数の呼びだし元へ どんどん Exception の Unwinding
が生じて、RAIIのデストラクタで fclose()が呼び出される可能性も有るかも知れない。
そうなって、さらに、その fclose()がエラー終了する場合がある。
ダイアログの生成に失敗したタイミングで、エラーメッセージの表示のために、
メッセージボックスのダイアログを出すことになれば、もしかしたらかなり危険な
バグを含むことになってしまうかも知れない。
2020/06/11(木) 12:49:26.16ID:flOLYJrB
>>286-288
ごめん、別の例外でスタック巻き戻し中の fclose() 失敗は無視でもいい想定だった。
元の例外が通知されればそれでいいだろうと。
破棄操作を提供すれば済むっていうのは、たとえば fstream について
正常フローから close() 呼び出せば fclose() の失敗は普通に処理できるっていう意味。

エラー発生後の後処理でのエラーについてはもはや例外処理機構とか RAII とか関係なく
エラー処理一般で難しさは変わらないのでは?
2020/06/11(木) 13:14:41.21ID:4Jo+eUkD
>>287
何を言い出すかと思ったらシングルスレッドを
気分だけマルチっぽく見せかけてるだけなやつの話か
2020/06/11(木) 17:56:16.10ID:+WuQ8P1K
そんなに大事なデータならverifyするだろ
2020/06/13(土) 16:05:30.52ID:ifM7/RIh
>>271
>知って簡単にいいますけれども、その例えば fclose() 失敗の通知をどこに送り、そして送った先では何をするのですか?
最終的にはユーザーに通知する

>通知をもらって何か手を打てるのですか?
ユーザーが通知に従い手を打てる

>>279
デストラクタ内での例外を送出したら即アプリが死ぬハズ
コアを吐いてくれたら通知にあたる情報が取り出せるかもしれないが美しくない

>>287
異常の内容をユーザーに通知することを目的とするなら
>エラーの通知先オブジェクトへのポインタをCMyXは持つ(>>252)
で事足りる
メッセージループは、通知先オブジェクトが1個だけもちさえすればユーザーへの通知の役目を果たせる
CMyXのようなケースは通知先オブジェクトを保持するオブジェクトからFactoryMethodパターンでインスタンス化
するのがいかにもOOP的で個人的には好み(CMyXのインスタンス化のときに通知先を確実に渡せる
2020/06/13(土) 16:59:34.64ID:1nypd8FJ
>>292
私が書いた >>279 ではデストラクタ内で対処を完結させろ (例外を投げずに済ますために) と書いてあるつもりなんだが、お前にはそれが読み取れなかったか?

ちなみに、現在の C++ ではデストラクタ (と delete) はデフォルトで noexcept で修飾されているものと見なされる。
これは例外を外へ送出しないことを保障するんだが、内部で例外が発生しないとは保証されない。
もし発生した例外を内部でキャッチせずに外へ出ていこうとしたら std::terminate() が呼び出される。
(スタックの巻き戻しは起こらずに即死するかもしれない。)

陽に noexcept(false) を指定したらデストラクタから例外を送出することは可能。
ただし、スタックの巻き戻し中に起動される別のデストラクタから例外が送出されると死ぬ。
普通は色々なライブラリを組み合わせるから問題が出ないようにするには
一貫してデストラクタからは例外を投げないのが妥当な設計だと考えられているってだけ。
2020/06/13(土) 17:06:07.88ID:ifM7/RIh
>>293
よく読んでなかったわサーセンwwwwwwwwwwww

>>292ので
>デストラクタ内で対処を完結させろ (例外を投げずに済ますために)
のアッパーコンパチになるのだから結果オーライで
オール無問題、
295デフォルトの名無しさん
垢版 |
2020/06/13(土) 20:11:16.15ID:K/U+GWpl
個人でc++使うことは少ないですか?
C#やelectronと比べて何倍手間がかかりますか?
2dのタイルマップエディタのようなものを作りたいのです、、、
https://www.mapeditor.org/
2020/06/13(土) 20:19:12.06ID:lPN2rvMv
挫折するリスクも加味すると100倍くらいじゃないかな
2020/06/13(土) 20:42:52.21ID:AVSH26bs
>>295
個人の場合、実はC++は適している。
むしろ、大人数の場合、いろいろなレベルの人がいるので速度を落としてでも、
誰でも使えるような言語を使おうとする企業が多い。
ちゃんとしたものを作りたかったら、C++は最良の選択。
2020/06/13(土) 20:55:51.74ID:AVSH26bs
ところで、全く関係ないけど、昔は、
標準変換(Standard Conversions)の1つに、
「Reference Conversions(参照変換)」
という項目があったのに、C++17では、Overload Resolution関連で
「Reference Binding(参照束縛)」
という項目だけになってしまった、という認識であってますかね?
もしかしたら古すぎて、もう分からないかな。
2020/06/13(土) 21:10:55.91ID:XHF92Eb6
c++がどうこういうこと自体無意味な気分。
OSとコンパイラのバージョン指定でもせん限り、特定の議論にもなりゃしない。
2020/06/13(土) 22:13:05.14ID:rMzKFBuy
これから始めようと思うのですが
C++とC♯の大きな違いは何ですか
どっちから先の方が良いですか?
2020/06/13(土) 23:19:47.34ID:B/JuT+NG
何作りたいかによるとしか言いようがない
302デフォルトの名無しさん
垢版 |
2020/06/13(土) 23:29:25.22ID:dAI/jSW6
あーじゃあ、C++には何が出来なかったせいで
後からC♯が作られたの?
2020/06/14(日) 00:35:35.69ID:0sKu6MyV
違うよ
2020/06/14(日) 00:45:05.04ID:lm4ZS132
んーでは、C++が劣っていてC♯が作られた理由は?
2020/06/14(日) 00:55:29.50ID:7AEk3bXh
インタープリ夛ー
2020/06/14(日) 00:58:40.28ID:g+gmh/oa
Javaの代わりが欲しかっただけであって優劣の問題はあまり関係がない
が結局Javaの領域には食い込めず、スクリプト言語の代わりになった
自由度を奪う代わりに楽に書けるみたいな
結局自由度が必要なのでC++から離れられないので余計書くのがつらい仕様になった
Win32APIのインクルードくらいSDKにまとめとけやPinヴォケって感じ
2020/06/14(日) 01:08:08.89ID:7AEk3bXh
インタープリティアひとつつくっておけば色々な環境に使い回せるし版権問題にうるさいJavaをぶっつぶすため
2020/06/14(日) 01:08:40.52ID:lm4ZS132
>>306
> Javaの代わりが…スクリプト言語の代わりになった

なるほどぉ、それでunityのスクリプトになってるのか、
C++の自由度って具体的には何を指すんですか?
2020/06/14(日) 01:17:15.70ID:7AEk3bXh
常識だろjk
310デフォルトの名無しさん
垢版 |
2020/06/14(日) 01:21:41.82ID:iYtMGgBJ
C++はアルゴリズムの部品化が一般的になっているので、自由に組み合わせられるところが、良いと思います。
2020/06/14(日) 01:33:23.99ID:MJZpLG29
>>308
やりたければメモリのどこにでもアクセスできるってのが特に重要な違いかな。
デタラメなアクセスをしても実行時エラーとして検出されるとは限らない。

プログラマがメカニズムを理解して正しくプログラムを書けるなら (監視して実行時エラーを検出するための) 保護機構は無駄で、
余計なものがある分だけ実行速度が落ちるから無い方がいい。
それが C++ の基本思想であるゼロオーバヘッドの原則。

でも現実はそうではない。 (プログラマは間違う。)
2020/06/14(日) 01:35:24.50ID:lm4ZS132
C++で出来るんならいったい、C++の何が悪くてC♯が産まれたのやら
さっぱりですね、
Wikipedia見にいったらc#はBoolean型とスイッチケースでストリング型が使えるそうなので
c#にしようと思います
お邪魔しましたわ、ありがとうございました。
2020/06/14(日) 01:41:28.38ID:9pT3ELpf
c#を選択するのは悪くないと思うが、そこじゃないだろ
2020/06/14(日) 01:45:14.17ID:lm4ZS132
あーうーん、自然言語処理とかネットのデータベースで
文字列比較を多用しそうな予定は未定なので・・
2020/06/14(日) 02:22:12.57ID:6myF93T5
>>298
MSDNのC++の仕様書を見ると、まだちゃんと Reference Conversionsの
項目があった。
C++17には無い項目だ。
2020/06/14(日) 03:45:35.31ID:PNQfdADa
文字列処理がメインで速度求めないならpythonとかの方がいいと思うぞ
2020/06/14(日) 03:48:19.28ID:kJWeEmyo
>>312
>C++で出来るんならいったい、C++の何が悪くてC♯が産まれたのやら
>さっぱりですね、
基本的に、Cの時代からポインタが理解できない人が多かった。
ポインタが理解できて無い人でも、コピペしたりすればC++も使えたかも知れないが、
ちゃんと理解できて無いので、理解できている人に比べてメモリーの解放を間違ってしまう頻度が高い。
そのため、ポインタが出てこないVBを使う人が多かった。
VBしか使えなかった人でもが使えるようにした上で、見かけ上の文法と言語の名称をC++に似せることによって
今までC++を使えずに肩身の狭い思いをしてきた人に希望の光を与えることに成功したのがC#。
2020/06/14(日) 03:50:45.95ID:kJWeEmyo
VB、VBと馬鹿にされてきた恨みつらみの反動で、C++は古いということにして、
新しいC#に適用できない老人が使う言語、という印象操作をする運動が
繰り広げられている。
2020/06/14(日) 04:05:18.35ID:kJWeEmyo
彼らの脳内では、なんとかしてC#の人気を出すことによって、
C++使いを減らしていけば、もう二度とVB、VBと馬鹿にされた暗黒時代に
戻ることがなくなると予定されている。
2020/06/14(日) 04:15:32.10ID:Lj4n2emQ
>>316
ありがとう、PerlやRubyも考えたんですが
文字列処理ってもコエカタマリン的な利用でDirectXが・・
2020/06/14(日) 04:43:58.99ID:kJWeEmyo
C#はC++は、現実にかなり遅い。
それはそれぞれを使って作成されたアプリを比較してみれば分かる。
よく分かる例としてはVSだ。C++製のVSは高速だったが、C#製のVSは劇遅。
もう一つは、FrontPageとExpressionWeb 4。
開発に使われている言語以外はほぼ同じアプリだが、C++製の前者に比べて
C#製の後者は劇遅。
322デフォルトの名無しさん
垢版 |
2020/06/14(日) 04:59:16.97ID:VVffaeyk
>>297
手間がかかりすぎると聞きますがどうなのでしょうか
2020/06/14(日) 05:00:21.83ID:Lj4n2emQ
それは.netフレームワークとかSilverlightの違いですか?WPF?でしたか?
Win XPとVistaの違いなようなDirectX使うか使わないかというかGUI処理ありきで画面とロジックを分けたゆえのXMLパーサーの重さなのか
グラボやドライバーがネックなような・・・
2020/06/14(日) 05:03:18.92ID:fGEYrFA/
俺も297と同意見
2020/06/14(日) 05:09:24.45ID:kJWeEmyo
>>322
MFCがGUI関連が弱いという問題はあるが、C++自体は、手間はそんなにかからない。
そんなに難しいわけでもない。
ちゃんとC言語のポインタ周りを勉強して理解することが大切で、
それさえ分かってしまえば、C++はCよりも開発効率がかなり高いし、安全。
メモリの解放の純粋なC言語では手間がかかったが、C++だとデストラクタが
発明されたことにより楽になり、そんなに危険度は高くない。
2020/06/14(日) 05:18:18.18ID:fGEYrFA/
Cでexitを安易に使う癖がついているやつには陰険な罠がデストラクタにはあるわけだが
2020/06/14(日) 05:29:57.20ID:qmm3PCBI
>>320
文字列処理なら、可読性が高い、Ruby 一択!

Perl は、意味の分からない暗号だらけで、ややこし過ぎる
2020/06/14(日) 05:35:47.32ID:qmm3PCBI
>>295
Electron も良いけど、Ruby on Rails も良い

ただし、Rails でも、GUI は、HTML, CSS/SASS, JavaScript, jQuery, Bootstrap。
または、React
329デフォルトの名無しさん
垢版 |
2020/06/14(日) 05:38:37.79ID:VVffaeyk
>>328
例えばウディタはC++で作成されているようです
3dでもないのにC++?と思ってしまうんですが、何らかのメリットがあるのでしょうか?
2020/06/14(日) 06:18:58.47ID:kJWeEmyo
>>329
まず、Electronは配布ファイルのサイズが数百MBあるので、それだけでも
プログラムの品質が下がる。
Rubyは、GUIに弱い。

C#は悪く無いとする人が多いが現実の本格的なアプリの例では遅いことが多い。
331デフォルトの名無しさん
垢版 |
2020/06/14(日) 06:21:59.90ID:iYtMGgBJ
C#、Electron、RubyはC++よりはるかに優れているので、そっち使ったほうが良いと思います。
それらは実行時最適化のおかげでC++の10倍速いという実験結果もあります。
2020/06/14(日) 06:23:08.37ID:kJWeEmyo
>>330
C#は、GUI部品はCで書かれているWin32を使っているので、簡単な
HelloWorld程度ではC++並の速度が出ているように見える。
ところが、使うメモリの量が上がってくると急激に遅くなる特徴がある。
メモリだけでなく、GUIパーツが多くなるだけでも遅いと聞いている。
凄腕プログラマの中には、実感としてC++の10倍遅い、という人がいる位。

現にVSやExpressionWeb 4の起動速度は以上に遅いし、起動後もとても遅い。
2020/06/14(日) 06:23:55.47ID:kJWeEmyo
>>331
みたいに嘘を言う人がいるのでだまされないほうがいい。
後で困るのは自分。
334デフォルトの名無しさん
垢版 |
2020/06/14(日) 06:25:03.87ID:iYtMGgBJ
>>333
対立求めてる人はとっとと追い出したほうが良い。
335デフォルトの名無しさん
垢版 |
2020/06/14(日) 06:42:43.23ID:iYtMGgBJ
>>333
おまえみたいに片棒担ぐやつもいないほうが良い。
おまえには王者の風格が無い。
何言ってんだふふんと、真のC++使いなら思えるはず。
おまえはC++を使えていない。
2020/06/14(日) 07:29:43.89ID:kJWeEmyo
>>355
>何言ってんだふふんと、真のC++使いなら思えるはず。

いや、C++は沢山の問題点を持っていることは事実である。
しかし、効率面でC#は、C++には大差で負けることも、現実のアプリの例では
垣間見えることもまた事実。
337デフォルトの名無しさん
垢版 |
2020/06/14(日) 07:32:52.41ID:iYtMGgBJ
じゃあいちいち他言語を下げるのはおやめなさい。
王者には王者の気品が求められるのです。
338デフォルトの名無しさん
垢版 |
2020/06/14(日) 07:34:59.87ID:VVffaeyk
>>330
>>332
労力的にはどれほど違うと思いますか?イメージでいいのですが
個人で
339デフォルトの名無しさん
垢版 |
2020/06/14(日) 07:35:16.26ID:VVffaeyk
c++使うといつまでも完成しないなんて話を聞いたもんですから
2020/06/14(日) 08:29:10.72ID:7AEk3bXh
いつまでも完成しないって
バカだからだろ
2020/06/14(日) 08:36:28.26ID:qmm3PCBI
可読性・難易度・バグりにくさ

動的言語
Ruby : 1
JavaScript : 3

静的言語
C# : 5

ポインターのある言語
C : 15
C++ : 75
2020/06/14(日) 08:39:06.10ID:g+gmh/oa
わかりやすい例でいうと、Windows10がどんどん重くなっているが
それは今までC++で書かれてた部分をC#で書き換え続けられているからといっても過言ではない
2020/06/14(日) 09:06:28.85ID:MuaS91+w
>C++で書かれてた部分をC#で書き換え続けられている
それは別になっとらんぞ
Windowsチームって.NET嫌ってるし
344デフォルトの名無しさん
垢版 |
2020/06/14(日) 09:14:55.23ID:VVffaeyk
>>340
手間がどのくらい違うのですか?
2020/06/14(日) 09:18:34.27ID:7AEk3bXh
>>344
同じダロ
頭悪くなければ
ライブラリを集めて使いこなせるくらいの頭な
2020/06/14(日) 09:20:16.16ID:g+gmh/oa
>>343
例えばタスクマネージャーや電卓はUWPだと思うが、これって.NETの焼き直しか再利用だと思ってるけどどうなんだろう
2020/06/14(日) 09:32:29.33ID:MuaS91+w
>>346
シェルとかも含めたXAML UIの部分のこと言ってるんだろうけど
あれはC#からも呼び出せるだけのネイティブで実装されたAPI(WinRT)だよ
今の電卓なんかはまさしくわかりやすい例で、特例でコード公開されてて全部C++(/CX)だよ
新規に打ち出そうとしてるWinUIもC++(/WinRT)での実装

UWPアプリ単体で見ればC++だったりC#だったりまちまちだろうけど
今はXAML=WPF=C#のイメージは切り離した方が良い
2020/06/14(日) 10:00:52.61ID:g+gmh/oa
>>347
納得した
にしても以前の電卓よりはるかに動作が重い
呼び出し元より呼び出し先に重い何かがある気がしてならない
2020/06/14(日) 10:31:38.76ID:v+4IVp6H
>>335
王者の風格とか気品とか、真のC++使いだとか、そのキッズが喜びそうなワードばかり並べ立てて何がしたいの?
2020/06/14(日) 10:36:59.36ID:UiekgbQo
(精神的)キッズが喜びたがってるのだろう
2020/06/14(日) 10:59:07.21ID:fGEYrFA/
確かに「王者の風格」がでてきたときは0.5秒くらい「えっ?」てなった
2020/06/14(日) 10:59:49.90ID:v+4IVp6H
>>338
プログラムの実装時の労力は言語だけでなく作る対象によっても変わるからケースバイケースだけど、言語の習得の労力で言えば、C++でまともな実用的なプログラムを作れるレベルに達するのは他の言語に比べて大変だよ。
もし今現在まったくプログラミングの経験がないなら、C++よりC#から始めた方がいい。
C#で速度がでないことを心配するなら、C#で作ってどう改善しても速度が足りないとなってからC++を学習してC++に移植する方がトータルでは早くできそう。
そもそもC#では速度的に厳しいような難易度の高いプログラムを、未経験者がいきなりC++で作り始めることはかなりこんなんだと思うぞ。
2020/06/14(日) 11:01:19.61ID:u20vDDhC
コードの王子さま「まだまだだね」
2020/06/14(日) 12:21:48.10ID:7AEk3bXh
孤高だからな
2020/06/14(日) 13:07:15.05ID:8/gzWF83
>>322,>>339は(ある程度)事実だろ
2020/06/14(日) 15:06:28.05ID:CHdP3JGu
>>347
>今の電卓なんかはまさしくわかりやすい例で、特例でコード公開されてて全部C++(/CX)だよ
>新規に打ち出そうとしてるWinUIもC++(/WinRT)での実装

C++/CX はC++ではない。
それが遅い原因だ。
C++/CXを勝手にC++と思ってしまう人が出て本物のC++は迷惑。
2020/06/14(日) 15:42:22.25ID:CHdP3JGu
>>341
>C : 15
>C++ : 75

もともと、C++は、C with class 程度の意味で現れて、それで人気が出た。
その時は今ほど複雑でなく、Cではメモリー解放 free() を全部完全にプログラマが
書かなければならなかったところと、C++のデストラクタを使えば、ほぼ自動化することが出来た。
これにより、C++はCよりはメモリー安全になった。
型をC以上に厳密にすることで、コンストラクタとデストラクタの呼び出される回数が、ほぼ必ず同じに
なるように設計されていた。
キャスト構文を使わず、それぞれのデストラクタの中で、子供のオブジェクトに対する delete 文を
書き忘れない限り、ほぼ、コンストラクタとデストラクタは一対一に対応するので、
結果的にメモリーの解放間違いはほぼ無くせる設計になっていた。
これが、(恐らく)後になって RAII という言葉で語られるようになっていった。
また、クラスメンバに対しprotected属性が使えることも安全性を高めた。
さらに、Cでは実行段階で関数を超高速に切り替えるためには関数ポインタを使うことが必須であったが、
C++では仮想関数でそれを行うことが出来るようになり、間違いを減らすことが可能になった。
クラスの継承の概念は、既に作ったプログラムを少しずつ変化させることに役立つため、
プログラムを美しく設計できるようになった。

C++は今のバージョンは難しく見えるが、もともとはCを安全にすることにとても役立つものであった。
2020/06/14(日) 16:14:13.31ID:PqSUj3Py
「本物のC++」であるかどうかと速度は直接関係はないと思うが
2020/06/14(日) 16:48:51.00ID:p2S0rZ5U
>>357
>C++のデストラクタを使えば、ほぼ自動化することが出来た。

それ、全然「自動化」になっていないですよ…
2020/06/14(日) 17:11:05.05ID:CHdP3JGu
>>358
C++/CXは、メモリ関連で本物のC++とは異なったやり方をしている。
C++が速いのはまさにメモリ関連であるのだから、ソースの書き方が似ていると
しても、そこを変えた言語で書いたプログラムの速度がC++と同じであるとは
とても言えない。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況