C++相談室 part137at TECH
C++相談室 part137 - 暇つぶし2ch341:はちみつ餃子
18/09/07 23:38:50.05 EL+7DMJm0.net
>>324
出来るが、データ競合が起こらないように気を付けよう。

342:はちみつ餃子
18/09/07 23:41:24.38 EL+7DMJm0.net
質問者が状況を理解してない説明をしてるから本当に回答になってるのかイマイチわからぬ。
無理に言葉にしようとせずにコードを示してくれた方がいいんだがなぁ。

343:デフォルトの名無しさん
18/09/07 23:41:30.87 B/yxkRYZ0.net
バカじゃなければ
普通にアドレスが固定されてるstaticなメンバ関数のアドレスを
スレッドを開始させるアドレスにしてると推定できるからな

344:デフォルトの名無しさん
18/09/07 23:46:20.44 B/yxkRYZ0.net
このスレのバカどもはスレッドなんか
なんも分かってないからな
質問するヤツもバカになにを聞いてもムダだからな
そこの理解は必要

345:デフォルトの名無しさん
18/09/07 23:56:01.03 OXR/kEGJ0.net
>>335
>スレッドを開始させるアドレス
さすあに
スレッドを起こす質問に解釈しやがった;;
>>322
>メインスレッドはクラス化されており
>通信スレッドはメインスレッドのオブジェクトポインタ持ってます
と、>>324
>メインスレッドでもメンバ変数の変更値を参照できるのでしょうか
からすると通信スレッドで変更したメモリをメインスレッドでも参照できるのかという質問かとオモタわ;;;

346:デフォルトの名無しさん
18/09/07 23:58:34.82 B/yxkRYZ0.net
> 通信スレッドはメインスレッドのオブジェクトポインタ持ってます
まず一番最初に書いてることが読めてない
致命的な頭のワルサといっていい

347:デフォルトの名無しさん
18/09/08 00:00:18.18 j/6nk0eH0.net
普通にメインスレッドのメンバ関数呼び出して
メインスレッドのメンバ変数を変更すると読めるからな
こんだけコミュニケーションレベルが低いと
実生活でも支障があるレベルといっていい

348:デフォルトの名無しさん
18/09/08 00:03:28.41 VqyCCBP80.net
>>330
半角クンは自分の見たいものしか見えない、すなわち常に半角クンの中ではすべてのものを見通している視野100%ということなのだろう

349:デフォルトの名無しさん
18/09/08 00:04:14.21 49ssh0n4a.net
>>333
mutexしときます
いろいろアドバイスありがとうございます
>>329ですね

350:デフォルトの名無しさん
18/09/08 00:06:40.10 j/6nk0eH0.net
まずなこのスレの低学歴知恵遅れたちは
自分たちがどんだけ低学歴知恵遅れかという自覚がない
致命的といっていい

351:デフォルトの名無しさん
18/09/08 00:18:54.01 6MRSNGru0.net
低学歴知恵遅れなので質問の解釈に関する>>337>>339の違いがわからんが、
それはそうとして、当初の疑問に戻るが視野の広い>>342
>とうぜん同じ実体の変数を参照することになる
には一切注釈をつけなくて良かったの?

352:デフォルトの名無しさん
18/09/08 00:20:24.81 j/6nk0eH0.net
また低学歴知恵遅れが負け惜しみ意味不明なこといってるしな
低学歴知恵遅れの負けず嫌いは異常だからな

353:デフォルトの名無しさん
18/09/08 00:22:38.67 j/6nk0eH0.net
低学歴知恵遅れほど自尊心だけは高い
コレは底辺に多い
そして自分がゴミクズの低学歴知恵遅れである自覚もない
つまり救いようがない

354:デフォルトの名無しさん
18/09/08 00:30:51.48 j/6nk0eH0.net
低学歴知恵遅れの底辺ゴミクズほど自己評価だけは高い
その根拠のない自己評価の高さは
どこからくるものなかははっきりとは分からない
低学歴知恵遅れの底辺ゴミクズほどそういう傾向がある
それは経験からかなり相関が高いと確信している

355:
18/09/08 00:31:21.19 t7GfMYxV0.net
みなさん厳しいですね…
私は質問側ですが、そして今 schme スレで質問を丸投げしちゃっていますが、わからないときは、なにがわからないかわからない、という感じだったりしています
>>324
なにか断片的でいいからコード例をあげていただくと嬉しいです、例えば URLリンク(ideone.com)

356:デフォルトの名無しさん
18/09/08 00:45:27.68 j/6nk0eH0.net
むしろこのスレの低学歴知恵遅れの底辺ゴミクズたちは
質問してるヤツのレベルにすら到達してない

357:デフォルトの名無しさん
18/09/08 00:46:44.54 49ssh0n4a.net
>>347
pthread使ってる以外はほぼ同等な考え方です
実例作っていただきありがとうございます。

358:デフォルトの名無しさん
18/09/08 01:03:30.65 6MRSNGru0.net
>>326で書いたとおりスレッドAで変更したメモリをスレッドBで正しく参照できるのか否かというのは
微妙な問題なんじゃ
>>347のコードでf::nの書き換えと参照が正しく動くのは
20行目のC::f()呼び出しで呼び出されたstd::coutがメモリバリア的な効果を果たしたに過ぎないかもしれん
(中でmutexとかcritical sectionとかなシステムコールを呼んでいるなら普通のOSならメモリバリアが効く
と自尊心だけは高い低学歴知恵遅れなので難癖をつけておく
実証はしない

359:デフォルトの名無しさん
18/09/08 01:10:28.57 6MRSNGru0.net
>>347のコードがそもそもC::nがvolatile宣言されていないのに安全に動いている理由は…
と始めると荒れる…!
それはともかくスレッド間のメモリの読み書きを>>341のmutexでガードするというのは大変良い心がけです
多少遅いかもしれないが遵守する限り泥沼に踏み込まずに済む

360:デフォルトの名無しさん
18/09/08 01:32:58.78 LCjnyCTn0.net
>>322



361:メインスレッドとサブスレッドで並列に起動して同じ変数を書き換えた場合、書き換えレースになる。 ロックっていう機構があるのでそれを参照。



362:
18/09/08 01:41:37.02 t7GfMYxV0.net
>>351
よろしければ教えていただけますか?
>20行目のC::f()呼び出しで呼び出されたstd::coutがメモリバリア的な効果を果たした
メモリバリアって要するに x86 の lfence, sfence, mfence のことですか?
これはCPUキャッシュがメインメモリに吐き出されることを保証するものですか?
これらの命令は Pentiumu2 あたりにはなかったと思います、でも Pen2 とか特に Celeron-BP6(abit) で普通にデュアルプロセッサできていたのはどうしてでしょうか?

363:デフォルトの名無しさん
18/09/08 02:36:49.43 6MRSNGru0.net
>>353
>これはCPUキャッシュがメインメモリに吐き出されることを保証するものですか?
ちげう
実行したコアのライトコマンドキューかリードコマンドキュー上の命令をその場で全部実行してしまうというもの
キャッシュのinvalidateやfillが起きるかどうかとは別の話(結果的に起きることもあるが常にではない
キャッシュと関係あるみたいな説明のページがあることは承知しているが苦情は漏れに言わないでホスイ
>これらの命令は Pentiumu2 あたりにはなかったと思います、でも Pen2 とか特に Celeron-BP6(abit) で普通にデュアルプロセッサできていたのはどうしてでしょうか?
古代の話は知らん
OoO(アウトオブオーダー実行)はすでにあったはずなので、ライトコマンドキューやリードコマンドキューもすでにあった
全くの推測だが、キャッシュのinvalidate操作が(invalidateを常に伴うため効率の悪い)メモリバリアと同じ効果があったとかではないかいや知らんけど

364:デフォルトの名無しさん
18/09/08 02:52:26.13 6MRSNGru0.net
ちなIA(Intel Architecture)のうちでも常識的なコア数のやつは
コア間のキャッシュコヒーレンシをハードウェアで勝手に取ってくれるので、
コア間のメモリ参照の不整合はメモリバリアだけ注意したら逝ける(キャッシュの存在は透過的

365:はちみつ餃子
18/09/08 02:58:07.14 VmsJpbI+0.net
>>353
こないだ atomic を使ってたけど、
atomic について調べたならそこらへんの話もどこかに書いてなかったか?
C++ 用語ではバリアでなくてフェンスって言ってるけど。

366:デフォルトの名無しさん
18/09/08 03:04:22.19 RizVmglH0.net
メメリバリアやフェンスの意味を知るにはcpuのメモリモデルの理解が必要
URLリンク(yohhoy.hatenablog.jp)

367:
18/09/08 03:04:32.58 t7GfMYxV0.net
>>354
>実行したコアのライトコマンドキューかリードコマンドキュー上の命令をその場で全部実行してしまうというもの
>キャッシュのinvalidateやfillが起きるかどうかとは別の話(結果的に起きることもあるが常にではない
なるほど…ちょっとだけ理解が進んだかもしれません
「はるか遠くにあるメインメモリに変更が反映されるかどうか」はプログラムの書き手にはあまり関係がなく、
「各コアから見る限りにおいて、各コアが発したライトあるいはリードの結果すべてが反映され、各コアからはみえている」と考えればいいのですね
これらのメモリの可視性について URLリンク(www.cs.tsukuba.ac.jp) 等を熟考しています
mutex や cond にその方面での効用があるとは…、pthread のメモリ可視性に関する効果はあまり意識していませんでした
重要なヒントをくださりありがとうございます

368:
18/09/08 03:17:34.12 t7GfMYxV0.net
>>356
ええ、atomic に関係する話をいろいろと読んではいたのですが、正直なところ、あまりよくわからなかったことを告白します
acquire とか release とか、いまひとつイメージできなかった…
atomic の各メンバ関数の memory_order は C++デフォルト引数として sequence-consist(ency) を与えていることはわかりましたので「最強にしているから、まあいいか」くらいですましていました
>>354
>実行したコアのライトコマンドキューかリードコマンドキュー上の命令をその場で全部実行してしまうというもの
この記述が一番しっくりきました

369:
18/09/08 04:20:01.69 t7GfMYxV0.net
>>352
>書き換えレース
ええと、これを読んで reset-set flip-flop の禁止入力「R=S=1」のことを思い出してしまったんですが、それはさておき
複数のコアが同一メモリに対して「同時に書き込み」する、というのは、このフリップフロップ禁止入力と同じ意味あいですか?
つまり「どっちの書き込みが後になるか、予想がつかないから禁止」…①
それとも、「複数のコアが本当に同時に書き込んでしまった場合、結果が不定になる」…②
(昔のフロッピーディスク供給のソフトウェアプロテクトの方法としての「コロコロビット」=読み出すたびに 0/1 が変わる)という意味なのか
いや、①も②も同じような意味なのかもしれませんが、
>>215 の「CAS 連続スピンロックや CAS 連続スピンロック中に別コアから書き込んだり読み込んだりすること」
が②の意味で危険で、ソフトウェア側で mutex や dirty-bit (>>238) を設けて本当に意図的にコントロールしなければならないのか、と、ちょっと心配になりました
最初から安全側にふっておくとは思いますが

370:デフォルトの名無しさん
18/09/08 08:05:39.39 RizVmglH0.net
考える前に学んだ方がいい
cas が使い物にならないならなぜそんな物があると思う?
というか mutex の実装にも cas は使用される。
使い方がわからないからcasは使わず mutex を使うという判断は正しいが、
例えば前の例のエラトステネスの篩で実装1ビットセットする毎に
mutex で排他していたらコアがかなり沢山あってもシングルスレッドの方が速い
(mutex api を処理する時間が大半を占めてしまう)

371:デフォルトの名無しさん
18/09/08 08:13:01.68 RizVmglH0.net
質問する前にスレッドセーフとか排他制御とかレースコンディションとか
弱いメモリモデルとかでググって時間くらいしっかり読んで

372:デフォルトの名無しさん
18/09/08 08:13:34.47 RizVmglH0.net
>時間くらい
「1時間くらい」のタイプミスでした。

373:デフォルトの名無しさん
18/09/08 11:49:10.23 +e2Zk2SC0.net
>>360
cpuのメモリモデルの説明読んだら最初の方に書いてあると思うけど
普通ワード単位のアクセスは何もしなくてもハード的にアトミックであることが保証されてる
そこで壊れたらやってられないからな

374:デフォルトの名無しさん
18/09/08 13:52:50.37 UCzuGyPmM.net
>>360
> つまり「どっちの書き込みが後になるか、予想がつかないから禁止」…①
順序は予測できないと言うのは正しい
> それとも、「複数のコアが本当に同時に書き込んでしまった場合、結果が不定になる」…②
通常のプロセッサならこれはない
排他制御がなされていてどちらかの結果が最終的に反映される
ただ CAS (Compare And Swap) 命令はそう言う話じゃなくて読出動作 (Compare) と書込動作 (Swap) がアトミック(つまりその間には他のアクセスは無いように制御されてる)ってこと
ソフトでどうのこうのできる話じゃないからシステムから提供されてるAPIを素直に使いなさい
>>364
中途半端な知識で語るなよ

375:デフォルトの名無しさん
18/09/08 16:38:24.58 +lRq1NsW0.net
>>364
だよな
同一のCS, WE/OEをファンアウトさせるわけで
配線遅延があってもクロック同期で関係なくなるし

376:デフォルトの名無しさん
18/09/08 20:07:53.81 6MRSNGru0.net
このスレは荒れる…!
マルチスレッド、マルチコア、アウトオブオーダー実行(OoO)にまつわる3つの問題は分けて考えられねばならない;
 (A) 書き換えレースの問題(>>352
 (B) アドレスxに対する読み書きのatomic性(>>364
 (C) メモリバリア(>>354
(A)はマルチスレッドすればシングルCPUでも起きる問題
(B)はこれは何ビット幅までの読み書きを他コアが割り込み不可能なバスサイク


377:ルで行えるかという話。マルチコア固有 (C)はマルチコア状況化でのアウトオブオーダー(OoO)実行の影響をソフトで制御して無問題にするテクの話で、マルチコア×OoO固有の話 >>364は(B)のことを言っており、だいたい合っているんじゃ (IAの場合、4バイト境界に整列した32ビットまでは(B)の意味でatomicに読み書きできる  整列していないデータの読み書きは16 bitであっても(B)の意味でatomicではない  インテルのマニュアルに書いてある  自尊心だけは高い低学歴知恵遅れなのでいちいちソースは示さないが



378:デフォルトの名無しさん
18/09/08 20:29:14.34 6MRSNGru0.net
とはいえ、読み書きをミューテックスなりロックなりでガードする、…(D)
これだけを遵守すれば>>367の問題は全部忘れて良い(>>351の後段にも書いた)
メモリモデルとかまともに勉強する必要は無い
さらに言うと、まともなコンパイラなら(中でどんな副作用やメモリバリアを行うかわからない)システムコールを跨いだ
変数のレジスタ割り当てとかしないから、(D)を守れば実際のところ(ほとんどのケースで)volatileも要らん
メモリモデルを勉強する必要があるのは、(D)の速度に不満が生じて改善する必要に迫られたとき、
例えばdouble-checked lockingテクがちゃんと動くのかとか不安になったりロックレスハッシュを作らねばならなくなったときだけ!

379:デフォルトの名無しさん
18/09/08 22:09:03.01 Mc6Ny40VM.net
>>367
マルチプロセッサとかNUMAの事は考慮しなくても良いのけ?

380:デフォルトの名無しさん
18/09/08 23:30:32.50 ZUEeKRTR0.net
バスサイクルと言ったりミューテックスって言ったり話のレベルがぐちゃぐちゃすぎる…

381:デフォルトの名無しさん
18/09/09 01:33:18.67 XJaXrhZ00.net
なんせC++は生ポが使える低水準言語ですし・・・

382:デフォルトの名無しさん
18/09/09 03:24:55.55 Q3MV1FJL0.net
要するにあらゆる左辺値をatomicにして更にミューテックスでガードしとけば(これはキチガイ)
ハード系の知識を学ぶ必要はない(ハードソフトという名の蛸壺)という無茶苦茶な主張だな
勉強嫌いにもほどがあるだろ、何が低学歴だ

383:デフォルトの名無しさん
18/09/09 08:36:42.55 BqWnELncM.net
周辺チップからのメモリ書換をミューテックスでガード出来るのか

384:デフォルトの名無しさん
18/09/09 08:59:15.50 9h0HyZsY0.net
実際プログラミングする上でハードの知識はいらんだろ

385:デフォルトの名無しさん
18/09/09 09:25:43.25 BqWnELncM.net
ハードの知識無しでデバドラ書けるのけ?

386:デフォルトの名無しさん
18/09/09 10:19:49.00 Q3MV1FJL0.net
>>374
メモリのゴーストとか普通に出てくるだろ
PCという狭い牧場から出たことのない家畜は知らんだろうけど

387:デフォルトの名無しさん
18/09/09 10:31:54.13 9h0HyZsY0.net
>>375
は?プログラミングが書けると言っただけでデバドラのプログラミングするなんて言ってねえよ
じゃあお前は信号処理を知らずに音声合成のプログラミング書けるのか?
>>376
だからそんなの考慮知らなくもソフトウェアは作れるんですが

388:デフォルトの名無しさん
18/09/09 10:37:46.17 kQslwDxe0.net
作文したら推敲しろ、って小学校で習うはずなんだけどな

389:デフォルトの名無しさん
18/09/09 10:39:04.08 9h0HyZsY0.net
>>378
え?
お金も払われないのに推敲?
時間の無駄じゃん

390:デフォルトの名無しさん
18/09/09 11:01:35.79 Q3MV1FJL0.net
>>377
ああ家畜か
人間よばわりして悪かったな

391:デフォルトの名無しさん
18/09/09 11:25:28.91 lGJ+2GvF0.net
ハードウェア部分を隠すためのOSによるアクセスの抽象化とか、
標準ライブラリがあるわけだし、ハードウェアの知識が絶対に必要でもないでしょ。
デバイスドライバを書くプログラマが優れているとか、その反対に
高レベルな(抽象度の高い)ソフトを作る人ほど偉いってものでもない。

392:デフォルトの名無しさん
18/09/09 11:26:29.90 l6rR/pccM.net
>>380
逆に家畜はお前じゃね?
ハードウェアを意識しないとプログラミング出来ないなんて可哀相

393:デフォルトの名無しさん
18/09/09 14:43:15.61 TxROatu90.net
何これ?

394:デフォルトの名無しさん
18/09/09 15:02:39.54 //bKOaXP0.net
いつものマウントごっこだろ

395:デフォルトの名無しさん
18/09/09 16:27:56.67 TAQT5wBea.net
for i in {0..15}; do
mount /dev/dm-$i /mnt
done

396:デフォルトの名無しさん
18/09/09 17:06:11.77 V1LakR3i0.net
捕食される側の人類最底辺同士で争ってる

397:デフォルトの名無しさん
18/09/09 17:19:50.37 xES8AK750.net
低レベルプログラミングって言う面白そうな本が出てたなあ

398:デフォルトの名無しさん
18/09/09 18:06:25.87 acpzPeVw0.net
そういえば、さいきんの低レベルいじる時ってどうするんやろね。
BIOSなくなってきてるし、作法かわってきてるのかなぁ・・・。

399:デフォルトの名無しさん
18/09/09 18:53:37.14 +aTtRZce0.net
古き良きシリアルポートが普通のPCではほぼ絶滅してるからなあ
USBきらい

400:デフォルトの名無しさん
18/09/09 19:01:40.42 acpzPeVw0.net
USB制御のノウハウってあんまり周知されてない感じがする。

401:デフォルトの名無しさん
18/09/09 19:09:08.66 Q3MV1FJL0.net
アイソクロナス?

402:デフォルトの名無しさん
18/09/09 19:38:22.19 eYgKQZDEM.net
>>382
高級ってのを誤解しているアホがここにもいたわw

403:デフォルトの名無しさん
18/09/09 21:21:28.72 TxROatu90.net
>>390
LINE EYEで見てるとエラー出まくったりしてるね

404:デフォルトの名無しさん
18/09/10 22:46:19.98 IGaBABI/d.net
dllからexeをCreateProcessで起動するとメモリリークするとかある?
debugging tool forなんたらみたいなやつでメモリリークチェックしてるのだけど
exeから呼んだやつはリークなし
dllから呼んだやつはリークありとなっている
監視開始ポイントと終了ポイント及び呼び出しソースコードに差分がなく
その他にも差分がないんだ

405:デフォルトの名無しさん
18/09/10 23:03:06.10 XzQQxj6r0.net
dllから呼びだす場合
dllは呼びだした側のプロセスと同じアドレス空間にマッピングされ
dll側の関数を呼び出して生成されたヒープも
呼びだした側のプロセスと同じアドレス空間にマッピングされる
プロセスから呼び出した場合、
呼び出した側のプロセスと関係ない呼び出された側のプロセスのアドレス空間に
ヒープは生成されるから
呼び出した側のプロセスを監視してもそのリークについて検出されることはない
分かった?

406:デフォルトの名無しさん
18/09/11 05:56:49.25 3QLqjO4o0.net
質問と回答が違う

407:デフォルトの名無しさん
18/09/11 09:46:04.97 THBnA1g1M.net
そのツールでもうちょっと情報とれないんかいって思うが、
ランタイムライブラリの指定とか見直してみたら?
というかexe起動を繰り返したら繰り返すだけリークする?
最初の一度だけならあんまり気にしなくていいんじゃない?しらんけど

408:デフォルトの名無しさん
18/09/11 22:07:19.41 i7axZbyN0.net
質問通りの
コレ以上ないエレガントなレスになってる

409:デフォルトの名無しさん
18/09/11 22:09:50.93 BTBlWiGG0.net
あかねちゃん。

410:デフォルトの名無しさん
18/09/12 00:18:15.71 B23czwA60.net
>>394
umdhじゃないかと思うが、スタックトレースは見てみたの?
プロセスの標準入出力に名前付きパイプが指定されてるとdllの明示的なアンロードのタイミングでApplication verifierでリーク検出されたことはあった。

411:デフォルトの名無しさん
18/09/12 09:57:57.91 OqmF7RQ90.net
>>394
dll ってことは何かの exe の中で動いてるんだろ
そっちのコードが他スレッドで何かアロケートしてるとか
単に dll の問題で CreateProcess しなくてもリークしてるとか

412:デフォルトの名無しさん
18/09/12 19:18:39.87 BIkz+Ggud.net
>>397
>>395
>>400
>>401
色々とありがとう。UMDHです
色々と試してみたところ繰り返し行ってもリーク量は増えなかったので、自分が作成したロジック以外でのリークみたいでした
UMDHは増えず、タスクマネージャー上のプライベートメモリとかが増えてくのは気になったけども....

413:デフォルトの名無しさん
18/09/14 01:05:55.69 y0a2qOvJ0.net
>>402
メモリはコミットサイズを確認。
あとはハンドルをクローズしてないとかはないよね。

414:はちみつ餃子
18/09/14 01:26:50.31 NOYHI4qj0.net
>>402
UMDH は増えずにタスクマネージャー上のプライベートメモリが増えるということは必ずしも問題があるわけではない。
(もちろん問題がある場合もある。)
malloc や new で割り当てるメモリは、
OS からある程度のメモリを融通してもらった塊をアプリケーションのレイヤ (ランタイムライブラリ) で切り分けて提供することになる。
足りなくなったらまた OS に要求する。
しかしその要求というのも、メモリ空間を予約するだけで物理メモリはまだ割り当てないかもしれない。
「プライベートメモリ」というのは予約したメモリ空間のサイズを表すらしく、
実際のメモリ使用量を表さないので、
基本的には UMDH をあてにした方が良いと思う。

415:デフォルトの名無しさん
18/09/14 04:46:07.61 Ln8BSCnm0.net
gflagsで対象exeのメモリ割り当てをコンパチブルモードにしてみたら

416:デフォルトの名無しさん
18/09/14 07:55:52.78 05hGeAAsd.net
>>403
コミットサイズを確認すれば良いんですね
ハンドルクローズもしてますね
ありがとうございます
>>404
分かりやすくありがとうございます
差分が出ることもあり得るのですね
丁寧でとても助かりました

417:デフォルトの名無しさん
18/09/14 20:22:01.09 KUzt6BBd0.net
プログラム全体で使いたい変数を宣言する際は
グローバル変数として宣言するのと#defineするのって何か違います?
どっちを使えばいいんですかね?

418:デフォルトの名無しさん
18/09/14 20:34:55.91 9HmXun5pa.net
#define という事は定数だと思われるのでconstexprな変数に一票。

419:デフォルトの名無しさん
18/09/14 20:44:10.13 kDrjUGbb0.net
グローバル変数だとコンパイルのときにエラーを出してくれる
#defineは値がヘンでもエラーを出さない

420:デフォルトの名無しさん
18/09/14 20:54:15.35 c9w6X9S4M.net
どっちとか言う前にもう少し言語仕様を理解してこいよ…

421:デフォルトの名無しさん
18/09/14 21:06:34.91 YK4Q2JFR0.net
>>407
そのレベルならいったんdefineは忘れるべき。
defineはほとんどの場合ただの置換に過ぎない。

422:デフォルトの名無しさん
18/09/14 21:31:46.88 fXySkelb0.net
C++なら値変更不可な参照のみのシングルトンにしとけばいい
シングルトンを動的にイニシャラズできるようにすれば起動時に設


423:定の変更ができたりするようにできる めんどくさかったらdefineでいい defineかえてコンパイルしなおせばしまいだからな そういうdefineはカテゴリー毎にまとめてぜんぶ一か所に書いときなさい シングルトンでも裸の外部変数はやめておいたほうがいい それさえしなければどうでもいい



424:デフォルトの名無しさん
18/09/14 21:53:36.47 YK4Q2JFR0.net
し、シングルトン?
この話題でまさかのsingleton笑
さすがにこれはネタだよね?

425:デフォルトの名無しさん
18/09/14 21:55:11.25 fXySkelb0.net
外部変数はシングルトンの変数だからな
なにもおかしくない

426:デフォルトの名無しさん
18/09/14 21:56:25.39 YK4Q2JFR0.net
ここで言ってるsingletonって所謂GoFデザインパターンのsingletonだよね?

427:デフォルトの名無しさん
18/09/14 21:58:26.14 fXySkelb0.net
そもそも池沼のID:YK4Q2JFR0はdefineがなにかすらわかってないからな
> defineはほとんどの場合ただの置換に過ぎない。
ほとんどもへったくれもなく
defineはただの置換だからな
頭悪い

428:デフォルトの名無しさん
18/09/14 21:59:24.65 fXySkelb0.net
頭悪いやつはムリしてレスしなくていい
なにもわかってないんだからな

429:デフォルトの名無しさん
18/09/14 22:01:10.88 gH/Sje3Q0.net
>>416
結合と文字列化もあるから「ほとんど」であってるが

430:デフォルトの名無しさん
18/09/14 22:01:20.46 YK4Q2JFR0.net
いつもの半角くん病が発症したらしいw
毎度毎度、燃料投下、お疲れ様ですm(_ _)m

431:デフォルトの名無しさん
18/09/14 22:02:21.10 fXySkelb0.net
defineか外部変数にしたいとかいう質問だからな
普通にグローバルを定数値をもたせたいという質問内容なのに
このスレの低学歴知恵遅れたちがどう解釈したかはしらない

432:デフォルトの名無しさん
18/09/14 22:02:53.11 fXySkelb0.net
結合も文字列かもただの置き換え

433:デフォルトの名無しさん
18/09/14 22:05:22.67 fXySkelb0.net
まず低学歴知恵遅れは日本語を読解する能力がない
ものごとも抽象的にみる能力もない
つまり認知機能に著しい欠陥がある

434:デフォルトの名無しさん
18/09/14 22:05:58.57 BDjkgOYf0.net
ID真っ赤にして火病起こしたか

435:デフォルトの名無しさん
18/09/14 22:06:56.64 fXySkelb0.net
静的にどう置換されるかコンパイル時に決定されてるからな
このスレに池沼たちは、いつもなにをいってるか意味不明なワケ

436:デフォルトの名無しさん
18/09/14 22:07:36.57 YK4Q2JFR0.net
>>420
こういうtypoをツッコむのは本来嫌いなんだが、せっかく燃料投下してくれたお礼に一応指摘。
「グローバルを定数値をもたせたい」
毎回言うけど、C言語の前に日本語勉強したほうがええで。

437:デフォルトの名無しさん
18/09/14 22:09:30.41 fXySkelb0.net
低学歴知恵遅れが指摘できるのはこの程度
自分の著しい頭の悪さを棚にあげるからな
グローバルに定数値をもたせたい
とまともな日本語読解能力があれば
普通に読めるからな

438:デフォルトの名無しさん
18/09/14 22:10:14.11 fXySkelb0.net
ともかくとてつもなく頭悪い
しかもとてつもなく頭悪いという自覚がない

439:デフォルトの名無しさん
18/09/14 22:10:23.49 YK4Q2JFR0.net
>>426
よしよし、今日は素直でよろしい。

440:デフォルトの名無しさん
18/09/14 22:11:29.39 fXySkelb0.net
で、オマエは自分の頭が
とてつもなく頭悪いのは自覚してんか
ゴミでクズな人間であることも自覚できてんのか

441:デフォルトの名無しさん
18/09/14 22:12:33.95 YK4Q2JFR0.net
さすがにもうワンパターンで飽きてきた。
もっと違う煽り方考えてよ。
ツンデレ的なのはどう?

442:デフォルトの名無しさん
18/09/14 22:14:52.54 fXySkelb0.net
煽り?
まず事実だからな
バカは自分がバカである自覚がない
だからバカが直らない
すべてゴミでクズな人間性の問題
ゴミクズには内省というもんがない

443:デフォルトの名無しさん
18/09/14 22:18:12.66 YK4Q2JFR0.net
最初は褒めて褒めて褒めちぎった上でミスリードを誘い、その上でボロクソに貶すとかどう?
さすがに皆そのやり方は飽き飽きしてるよ。

444:デフォルトの名無しさん
18/09/14 22:34:27.68 5DPUkElZ0.net
子猫がかわいくて甘噛みされたらちょっと叩いたあとで頭なでなでしてたら
大人になっても強くかむようになって困ったのを思い出した
なんだかなあ

445:デフォルトの名無しさん
18/09/15 00:40:17.11 KIanXBkQ0.net
オレはこんなことはしてないからな
                        タカイ
                     ∧_∧ タカーイ
                  m⊂(´・ω・)⊃
                ⊂c  ノ__  ノ
             /⌒ヽ  | .|  | .|                /⌒ヽ
            ( ^ω^) i i二 .ノ               _( ^ω^) il|   死ね
          (´  二二二 ノ                (´ \   \|il |il il|
         /    /:                  /  \. \ノ\. \il| |il|
        i===ロ==/                   i===ロ== ヘ. \. i|!l !l\il|
       ノ:::::::::::::::::ヽ                  ノ:::::::::::::::::ヽ \ ヽη /')/')
      /:::::::::::へ:::::::::ヽ                /:::::::::::へ:::::::::ヽ  ヽ_,,..)  /
     /::::::_/   \:::::::)              /::::::_/   \:::::::)   )  ( / /
   /::_ '´      |::::|            /::_ '´      |::::| ⊂(v   )⊃
   レ          しつ           レ          しつ`) \ 〆 (´ ̄           
                                         /⌒Y⌒ヽ
ただの被害妄想
オレは事実を書き込んでるだけだからな
まず事実が事実であることを自覚するところから


446:デフォルトの名無しさん
18/09/15 01:10:27.96 FCP8vuXka.net
バイナリファイルの読み書きはfstreamとFILEどちらがオススメですか?

447:デフォルトの名無しさん
18/09/15 01:53:04.57 wlkSFfZ20.net
#include <iostream> is Forbidden

448:デフォルトの名無しさん
18/09/15 04:03:10.64 x4qTic2YM.net
FILE

449:デフォルトの名無しさん
18/09/15 06:14:52.60 /OsufeBT0.net
>>407 を虚心坦懐に読めば
「#defineじゃ定数値しか作れんのだから変数にする以外ない」
という身も蓋もない答えもありうるわな。
さすがにそんな揚げ足取りをする人はいないみたいだけど。
プログラム全体で参照する定数値をconstのグローバル変数にするか
#defineにするか、なら一般的にはconst変数の方が好まれるかな。
const変数の利点と言うより、#defineの弊害を避けるためって理由で。
その定数が整数値なら enum class も候補に入れてくれ。
static_castが面倒臭いかも知れんけど。

450:デフォルトの名無しさん
18/09/15 08:40:54.56 8TAknpK9d.net
ここまでconstexpr1つもなしなのはみんな意図的?

451:デフォルトの名無しさん
18/09/15 09:11:50.04 pVwVWDM8M.net
>>439
つ 408

452:デフォルトの名無しさん
18/09/15 09:12:10.24 hHXkfIbs0.net
>>439 >>408

453:デフォルトの名無しさん
18/09/15 09:39:05.72 u2jcQID60.net
整数の定数くらいならconstexpr付けても付けてなくても大して変わらなくない?
const int n = 42; と constexpr const int n = 42; って何が違うの
どっちも定数式文脈で使えるでしょ

454:デフォルトの名無しさん
18/09/15 10:09:16.49 8TAknpK9d.net
>>440
>>441
節穴だった申し訳

455:デフォルトの名無しさん
18/09/15 10:28:10.96 wlkSFfZ20.net
constexpってクソださい仕様だよな
勝手に推論して最適化しとけや

456:デフォルトの名無しさん
18/09/15 11:23:26.53 oMwX4DqWa.net
>>438
関連性のある定数群をまとめる為にはスコープがあるenum classはいいんだけど、
フラグとして使うのが難しいのがちょっと難点
enum class PNG_COLOR_MASK: uint8_t{
GRAY = 0b000,
PALETTE = 0b001,
RGB = 0b010,
ALPHA = 0b100
}
enum class PNG_COLOR_TYPE: uint8_t{
GRAYSCALE = PNG_COLOR_MASK::GRAY,//できない
RGBA = PNG_COLOR_MASK::RGB | PNG_COLOR_MASK::ALPHA//できない
}

457:デフォルトの名無しさん
18/09/15 14:56:24.44 u2jcQID60.net
フラグとして使うならoperator|と&をオーバーロードするのが良いけど面倒だね
PNG_COLOR_MASK operator|(PNG_COLOR_MASK e1, PNG_COLOR_MASK e2)
{
 using u_t = typename std::underlying_type<PNG_COLOR_MASK>::type;
 return PNG_COLOR_MASK((u_t)e1 | (u_t)e2);
}

458:デフォルトの名無しさん
18/09/15 15:34:42.86 oMwX4DqWa.net
ここまでやって更にstatic_castも必要となるという。

459:デフォルトの名無しさん
18/09/15 16:32:07.11 I8Ewbo070.net
>>444
むしろ俺はコンパイラでやらずビルドシステムで対応すべきことだと思っているが。
なんでもコンパイラに押し込もうとする悪しき風習に思う。

460:デフォルトの名無しさん
18/09/15 19:18:14.78 XFoW6siK0.net
fstreamでも結局writeするのでFILEと比較して都合のいい方を選べばいいよ。

461:438
18/09/15 19:36:37.14 /OsufeBT0.net
enum class はスコープを限定できる代わりに、個別の型として
ガチガチに保護されるせいで数値として使いにくい欠点はあるね。
namespace PNG_COLOR_MASK {
 enum {
  GRAY = 0b000,
  PALETTE = 0b001,
  RGB = 0b010,
  ALPHA = 0b100,
 };
}
 int grayscale = PNG_COLOR_MASK::GRAY;
 int rgba = PNG_COLOR_MASK::RGB | PNG_COLOR_MASK::ALPHA;
こんな感じにnamespaceで名前なしのenumを囲むか。
素直にconstexprを使えばいいんだけど、C++11以前でも可というニッチな提案。


462:デフォルトの名無しさん
18/09/15 20:20:12.42 MJTXjpFoa.net
その場合structで囲むのもありだね。二進数リテラルはC++11以前では拡張だけど。

463:デフォルトの名無しさん
18/09/15 21:04:37.66 V75GOAR/a.net
>>446の案を利用(C++17以降?)
URLリンク(wandbox.org)

464:デフォルトの名無しさん
18/09/15 21:10:11.77 V75GOAR/a.net
少し修正
URLリンク(wandbox.org)

465:デフォルトの名無しさん
18/09/15 22:39:15.30 oE5p8K2a0.net
ようわからんがプログラムを書き始めた当初
#define CONST_A 3
だったものを
extern int g_varA = 3;
#define CONST_A g_varA
とすれはCONST_Aは一瞬で値を変更可能な「変数」g_varAに設計変更になれるキモス
(CONST_Aは定数のつもりだったが後から変数に変えたくなった場合
ただしそうしてしまうとプログラムのどこでも書き換えられてしまって危険極まりないので、
めんどくさくない限りシングルトンすべしという神の啓示に聞こえなくも無い
プログラム起動時のみに値を設定する目的であってプログラム動作中は定数扱いなのだとすれば、
シングルトンのマルチスレッド対応は特に何もしなくても良い(クリチカルセクションやミューテック巣やLOCKとか不要
まあ質問に対しては例の図画の「営業の約束」の類やな

466:デフォルトの名無しさん
18/09/15 22:48:41.06 VQoTXRx30.net
2進数書けないのは不便だと昔からおもてた

467:デフォルトの名無しさん
18/09/15 22:56:14.72 oE5p8K2a0.net
接頭辞0bというのは十六進数と紛らわしいから02にしよう

468:さまよえる蟻人間
18/09/15 22:58:34.46 2Qh39GgFd.net
02だと、8進とかぶっちゃうよ。

469:デフォルトの名無しさん
18/09/15 23:02:11.85 bZY/rtks0.net
8進がおかしい
0Oにしろ

470:デフォルトの名無しさん
18/09/15 23:06:12.86 oE5p8K2a0.net
二進数が書けたら書けたで、長ったらしくなるから桁区切りを入れさせろという要求が出るのは必至
犯人の要求はエスカレートする一方や

471:デフォルトの名無しさん
18/09/15 23:07:07.35 5HUBWRKg0.net
誰かが仕込んだバグ以外で8進数が使われてるところを見たことがない。
パメ族以外で8進リテラル使ってるやつなんているのか?

472:デフォルトの名無しさん
18/09/15 23:07:30.30 V75GOAR/a.net
C++14で桁区切りも対応してるぞ

473:デフォルトの名無しさん
18/09/15 23:17:11.26 xQnt+Dhj0.net
>>458
賛成!

474:さまよえる蟻人間
18/09/15 23:29:24.44 2Qh39GgFd.net
ダブルオー

475:デフォルトの名無しさん
18/09/15 23:35:07.74 VQoTXRx30.net
マイコンベーシックで2進数のドット絵キャラを見たときは笑劇だった

476:デフォルトの名無しさん
18/09/16 00:46:24.98 JK7FzOgWM.net
>>461
アポストロフィーがどうにも気持ち悪くて…
慣れるのかね、そのうち

477:デフォルトの名無しさん
18/09/16 06:21:32.85 TERwdiOQ0.net
int a = 123; // a = 123
int b = 0123; // b = 83
ほんとクソ仕様だなこれ

478:デフォルトの名無しさん
18/09/16 06:35:39.96 Ch2PxBqj0.net
桁区切りってISOにのっとってるの?
国によって違うけど対応してるの?

479:デフォルトの名無しさん
18/09/16 06:35:52.88 NJnAChO90.net
Unix系のファイルパーミッションは今でもしぶとく8進数だよな
大嫌いだからあの習慣早く滅亡して欲しい

480:デフォルトの名無しさん
18/09/16 07:40:39.31 R+r0qoR6M.net
>>467
可読性を高めるためのもの
コンパイラはただ読み飛ばすだけなのでお好きな記方でどうぞ
だったはず

481:デフォルトの名無しさん
18/09/16 08:43:28.35 +ao0anr70.net
>>460
unix のファイルパーミッションが3bit単位だから昔のソースではcreat()の引数に0755とか0644とか普通に書かれてる
てかそのための8進数だと思う

482:デフォルトの名無しさん
18/09/16 08:47:08.77 SOVIz+sV0.net
rwxrwxrwx
421421421
8進数なのはアタリマエ
8進数以外で表現しようがない

483:デフォルトの名無しさん
18/09/16 09:04:46.04 J7jkqE/NM.net
intelチップのマシンコードは3bit単位で意味が変わるから
ハンドアセンブル出来るひとは普通8進数使えるよ

484:デフォルトの名無しさん
18/09/16 09:08:16.62 NJnAChO90.net
stickyビットとかsetuidビットとか増えてるから本来はもう8進数じゃ足りないんだぞ
未だに引きずられて無理矢理8進数で表現してるのは害悪だから

485:デフォルトの名無しさん
18/09/16 09:14:30.28 lOWFqhA+0.net
>>465
気持ち悪いよな
アンダースコアでよかったのに何でって思う

486:デフォルトの名無しさん
18/09/16 09:19:40.62 yGlb1wug0.net
どっかに書いてあった。ユーザー定義リテラルと衝突するんだと。

487:デフォルトの名無しさん
18/09/16 09:20:40.61 AHKBmQkKa.net
ユーザー定義リテラルが先にきてて、アンダースコアだと重複してしまうから。
案としてはアンダースコアも出てたはず。

488:デフォルトの名無しさん
18/09/16 09:24:34.63 AHKBmQkKa.net
これやな。
URLリンク(cpprefjp.github.io)

489:デフォルトの名無しさん
18/09/16 09:30:17.66 Z6oeOzwN0.net
日本の数勘定として、3桁区切りより4桁区切りのほうが良いと思うの。
100,000,000と書いててもぱっと1億って分からん。
1,0000,0000のほうが分かりやすい。
ってC言語関係ないけど。

490:デフォルトの名無しさん
18/09/16 09:40:48.27 M63m8fL00.net
>>478
万事、英米基準だから…

491:デフォルトの名無しさん
18/09/16 10:16:56.42 lOWFqhA+0.net
operator "" _000 () みたいなアホなこと書かれかねないからか
なるほどthx

492:デフォルトの名無しさん
18/09/16 11:19:42.15 +ao0anr70.net
>>471
4bit区切りでいいだろ
4bit目は予備として0固定にしちゃえばいいだけ

493:デフォルトの名無しさん
18/09/16 11:23:02.16 +ao0anr70.net
>>465, >>474
URLリンク(askul.c.yimg.jp)

494:デフォルトの名無しさん
18/09/16 14:03:39.12 cGCWO0MtH.net
>>478
一億ってかけ
それ以外は認めん

495:はちみつ餃子
18/09/16 14:41:57.29 iD6L9h5X0.net
ユーザー定義リテラルで 1_億 みたいには書けるじゃろ

496:デフォルトの名無しさん
18/09/16 14:43:54.49 lOWFqhA+0.net
constexpr unsigned long long operator "" _\u5104 (unsigned long long val)
{
return val * 10000 * 10000;
}

497:デフォルトの名無しさん
18/09/16 14:58:07.76 lOWFqhA+0.net
// Header <japanese> synopsis
constexpr unsigned long long operator "" _\u4e07 (unsigned long long);
constexpr unsigned long long operator "" _\u5104 (unsigned long long);
constexpr unsigned long long operator "" _\u5146 (unsigned long long);
constexpr unsigned long long operator "" _\u4eac (unsigned long long);
constexpr unsigned long long operator "" _\u5793 (unsigned long long);
constexpr unsigned long long operator "" _\u25771 (unsigned long long);
constexpr unsigned long long operator "" _\u7a63 (unsigned long long);
constexpr unsigned long long operator "" _\u6e90 (unsigned long long);
constexpr unsigned long long operator "" _\u6f97 (unsigned long long);
constexpr unsigned long long operator "" _\u6b63 (unsigned long long);
constexpr unsigned long long operator "" _\u8f09 (unsigned long long);
constexpr unsigned long long operator "" _\u6975 (unsigned long long);
constexpr unsigned long long operator "" _\u6052\u6cb3\u6c99 (unsigned long long);
constexpr unsigned long long operator "" _\u963f\u50e7\u7947 (unsigned long long);
constexpr unsigned long long operator "" _\u90a3\u7531\u4ed6 (unsigned long long);
constexpr unsigned long long operator "" _\u4e0d\u53ef\u601d\u8b70 (unsigned long long);
constexpr unsigned long long operator "" _\u7121\u91cf\u5927\u6570 (unsigned long long);

498:デフォルトの名無しさん
18/09/16 15:01:20.18 AX2qPX270.net
mjk

499:デフォルトの名無しさん
18/09/16 15:13:55.06 NJnAChO90.net
まあ64bit整数は垓でオーバーフローしちゃうけどな

500:デフォルトの名無しさん
18/09/16 15:19:22.27 un+A0LAL0.net
アンダーバー必須?

501:デフォルトの名無しさん
18/09/16 15:23:34.17 PDH9z/EW0.net
予約語なのでユーザー定義リテラルをユーザー定義するときはないとダメ

502:デフォルトの名無しさん
18/09/16 20:49:23.78 ecoXNuEUM.net
>>482
あー、既視感はこれか…

503:デフォルトの名無しさん
18/09/16 21:37:31.50 Lm7yQOTf0.net
全然関係ない話だが
めんどくさいC,C++を習得すると
他言語学習が簡単に進む

504:デフォルトの名無しさん
18/09/16 21:46:28.57 h2MQFGAYM.net
>>492
つ VLIW

505:デフォルトの名無しさん
18/09/16 23:31:10.84 V0g35lEl0.net
他言語すべてがザコに見える
特にJAVA

506:デフォルトの名無しさん
18/09/17 00:00:35.54 x38HLuISM.net
多言語使いは問題解決能力が無いのに偉そう
特にJava

507:デフォルトの名無しさん
18/09/17 07:23:44.67 EVO8AkN40.net
ところで、C++ってどんな開発に使ってるの?
Linuxのアプリ以外で。

508:デフォルトの名無しさん
18/09/17 07:48:33.15 oxQatDsR0.net
URLリンク(github.com)
こんな感じの物が作れるようになった。win32apiだ。
コアはそれなりにできたが、UI作ろうとしたらバグで死亡ちゅう。テストは良いけど過信しないで。
VBとかC#のビジュアル開発がどれだけ楽か身に染みてきた。
ところで、[0,1]の引数のみで使える面白関数しらないかい?
logとかは線形な気がするのでもっとおかしな奴ないかい?

509:デフォルトの名無しさん
18/09/17 09:36:25.88 dZ3SMulNa.net
edcb

510:デフォルトの名無しさん
18/09/17 13:09:26.75 9OAi7Hbk0.net
>>496
アルゴリズムベンチマーク。
リークしててもそこまで問題にならんし、速度が実際どれくらい出るもんか調べるには良い。
まあcでも良さげな使い方ばっかだけど、namespaceとか多少ね。

511:デフォルトの名無しさん
18/09/17 14:24:16.64 zCVYDMXL0.net
>>496
速度が求められるアプリはC++でしょ
大規模データでシミュレーションとかJavaでは遅くて無理

512:デフォルトの名無しさん
18/09/17 14:39:27.45 r6sTx27/r.net
リークしてても?

リークしてても……?

513:デフォルトの名無しさん
18/09/17 14:44:25.11 zCVYDMXL0.net
>>501
そうだなw
盛大にリークしてたら速度にめちゃ影響するわな

514:はちみつ餃子
18/09/17 15:02:34.85 O6rb8eh90.net
ものすごい潤沢にメモリがあって処理が終わるまでに使い切ることがないという確信があれば
メモリを解放する処理を入れずに速度を優先することは無いわけではないと思うが、
それが妥当かどうかいちいち検討するコストをかけるくらいならちゃんと解放しておいた方がよろしい。

515:デフォルトの名無しさん
18/09/17 15:32:46.89 t936AOdi0.net
なんで速度を要する処理の途中でメモリを獲得するん?
なんで速度を要する処理の途中でメモリを獲得するん? 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)


516:デフォルトの名無しさん
18/09/17 16:08:31.17 0/ju7MLa0.net
>>503
「ものすごい潤沢」では意味がない
処理が終わるまでに最悪何バイト使う可能性があり、
実装されているメモリは何バイトなのか、
需要と供給の具体的な比較あるのみ

517:デフォルトの名無しさん
18/09/17 16:22:22.61 kSBsQrFK0.net
サーバープログラムみたいなもんだったら
リークしてたらどこでシステム停止するかわからんし大問題に繋がるだろうが、
てきとうなベンチマーク検証ならリークしようと最悪落ちようとそこまで支障をきたすわけじゃ無いってことだよ。
てか実際問題�


518:サのくらい実験的な意味合いの強いものじゃ無いとc++は苦しい気がするんだが。



519:デフォルトの名無しさん
18/09/17 17:13:04.47 EVO8AkN40.net
C++の生産効率、バク埋め込み率、デバックのしにくさを考えると、積極的にC++を採用すべき分野って限られてくるよね。
組み込みやドライバではCが主流だし、WindowsやスマホではほぼC++は使われないし、Webの世界ではスクリプト言語だし、計算分野ではPythonやMatlabやMathmaticaだし。
仕事でC++使う機会は最近めっきり減ったわ。

520:デフォルトの名無しさん
18/09/17 17:37:23.45 3kd9gc670.net
スマポとSTL使ってればリークなんかそうそう起こらんだろ
古臭いC++のイメージで語らないほうが良いよ爺さま方

521:デフォルトの名無しさん
18/09/17 17:41:18.57 qtGPC3c90.net
スマポと言っても一秒間に数千回数万回の確保とかしてたら流石に遅くなるんじゃね?

522:デフォルトの名無しさん
18/09/17 17:53:56.99 3kd9gc670.net
unique_ptrはナマポ使ってるのと一緒よ

523:デフォルトの名無しさん
18/09/17 17:55:45.86 SBpxj18K0.net
>>509
そんな機会はめったにないし、万が一あったらそこだけナマポとかで対処できるのはC++だけ

524:デフォルトの名無しさん
18/09/17 18:07:37.03 r6sTx27/r.net
>>502
いや、どんな場合でもリークしないように書けよと思って引っかかった

525:デフォルトの名無しさん
18/09/17 18:19:02.17 GutZ/6rY0.net
まあ趣味でない限り実用度が学習コストに見合わない感じはあるな
他に比べて

526:デフォルトの名無しさん
18/09/17 18:20:26.64 zCVYDMXL0.net
オブジェクトを1個1個newする?
でかいデータだと大量にnewするオブジェクトだったら配列で1MBとかまとめてnewしないと遅いでしょ

527:デフォルトの名無しさん
18/09/17 18:42:32.24 CEV1V8yd0.net
メモリ解放にも時間かかるけどそこは計測から外します
都合のいい計測をします

528:デフォルトの名無しさん
18/09/17 19:57:02.88 HG71i9DfM.net
>>508
それで安全になるかもしれないけど
コピーしまくり、newしまくりだったりとかよくあること
C++使う理由をよく考えたほうがいいと思うわ

529:はちみつ餃子
18/09/17 20:37:10.33 O6rb8eh90.net
>>516
ムーブの恩恵があるやで。

530:デフォルトの名無しさん
18/09/17 20:53:22.59 tpLtH4DE0.net
現代の C++ は処理系もライブラリもそれなりに賢いから、任せきりにしてもそれなりの効率になる。
ほとんど任せきりにできる高級言語としての面と、必要なとこは手動で書ける低級言語としての面を合わせ持つのが C++ の強み。

531:デフォルトの名無しさん
18/09/17 21:33:50.41 YgnM5prK0.net
>>512
お前は最低でも数万行くらいの規模のコード書いてから偉そうなことを言え

532:デフォルトの名無しさん
18/09/17 21:40:52.08 5VGXhp/T0.net
最近はC++もスマートポインタが主流で
メモリリークもツールでチェックすると聞いたが
現実はどんなもんなん

533:デフォルトの名無しさん
18/09/17 22:10:33.50 oxQatDsR0.net
VCには簡易メモリっチェックをするヘッダーがある。もちろん環境依存。
スマポでリークするのはかなり筋が悪い。

534:デフォルトの名無しさん
18/09/17 22:19:24.01 CEV1V8yd0.net
>>519
それはリークの言い訳にはならんで

535:デフォルトの名無しさん
18/09/17 22:33:55.31 SBpxj18K0.net
>>519
まあどんな場合でもは言いすぎだと思うが少なくとも正常系ではリークなしを目指すのは当たり前

536:デフォルトの名無しさん
18/09/17 22:36:30.00 oxQatDsR0.net
スマポでリークするケースというと、昔のインターフェースでスマポそのものが渡せないとかかなぁ。。。
希望としてはリファクタリングしてほしいところだけどね。

537:デフォルトの名無しさん
18/09/17 23:14:55.87 YgnM5prK0.net
>>522
誰が「規模が大きければリークしていい」と言った?
言ってないことを言ったかのように相手の主張を捻じ曲げるな
>>523
>アルゴリズムベンチマーク。
>リークしててもそこまで問題にならんし

538:デフォルトの名無しさん
18/09/17 23:17:40.96 2pCWAXV50.net
リークしたらヒープエリア毎Destroyすれば良いじゃない
@マリー・アンチョワネット

539:デフォルトの名無しさん
18/09/17 23:28:41.66 YgnM5prK0.net
あぁすまん、正常系について誤解してた
まぁ個人で使うレベルなんじゃないかね、本人が問題にならん言うてるし

540:デフォルトの名無しさん
18/09/18 00:08:27.62 z2qcvEfV0.net
ウィンドーズにはApplication Verifierがあります!!11!1!
>>521
malloc()とfree()が対応しているかはばっちりワカルのでかなり役に立つが
Win32APIで直接メモリ確保したりC++でメモリアロケータを0から自作した場合はどうなるかわからん…
perfmonで指定プロセスのprivate bytesの推移を取得しつつ長時間動かして直接消費状況を確認するというのがある意味最終手段だが
リークが無い(はずの)プログラムでもなかなか安定しないという印象
多分ユーザーコードからRAIIを排除しても拾ってきたライブラリがRAIIするとかそんな感じ!

541:
18/09/18 00:14:49.89 Iw2LHuqq0.net
>>528
グローバル new 演算子
グローバル delete 演算子
を malloc()/free() を使って定義して、かつ、未解放・二重解放を検出するようにポインタを線形リストに格納してチェックする、ということなら、簡単にできます
win32api でも、たとえば heapalloc() をラップすればいいかと
デバッグ初期の単純なミスならこれで大方弾けます

542:デフォルトの名無しさん
18/09/18 00:18:57.80 k3MAuD5K0.net
>>528
MS製だからWIN32位は拾ってくれると思ってたけど、なんだってー。Orz
俺は末端のユーザだからアロケータ書いたりしないのよね。
特に自作したらメンテとか自分でやんなきゃいけない負債になるのでやりたくないなぁ。

543:デフォルトの名無しさん
18/09/18 01:01:35.82 uOah9zOu0.net
>>530
application verifierはwin32apiをhookしてるよ。

544:デフォルトの名無しさん
18/09/18 01:07:33.27 7OxZ5HAL0.net
>>517
コンテナ形式のデータばかりと思うなよ

545:デフォルトの名無しさん
18/09/18 01:31:03.51 n7K73R0GM.net
hogeはdouble型で
int temp = int(hoge);
if (temp > 0)
return temp;
else
return 0;
このような処理をしたいのですが、何か良さげな内部関数とかないですかね

546:はちみつ餃子
18/09/18 04:24:56.90 CgLDhfQ00.net
>>533
C++17 の std::clamp みたいなことがしたいのかな

547:デフォルトの名無しさん
18/09/18 04:58:47.12 1zYpCWJ70.net
>>529
ランタイムのソース読んだ事無いの?

548:デフォルトの名無しさん
18/09/18 05:16:37.52 bwjvKD0M0.net
>>533
std::max(0, int(hoge))とか

549:デフォルトの名無しさん
18/09/18 06:06:39.75 mbB60zCK0.net
>>533
_mm_max_pd とかその辺

550:デフォルトの名無しさん
18/09/18 06:32:00.57 yg1A1NBg0.net
>>525
それはリークの言い訳にはならんで

551:デフォルトの名無しさん
18/09/18 06:35:34.10 BuheiE4nM.net
アルゴリズムベンチマークなんて長期間稼働するものでもないし、プロセス終わればリークも終わる。

552:デフォルトの名無しさん
18/09/18 06:55:51.70 1W/tmI+p0.net
>>533 の言う「内部関数」ってのは、
CPUのマシン語命令を直接利用するビルトイン関数みたいな感じかな。

553:デフォルトの名無しさん
18/09/18 09:38:53.59 GYwTywmv0.net
言い訳にならんよな
数万行って具体的な数値を出してきたのは奴だし

554:デフォルトの名無しさん
18/09/18 09:39:49.43 Zf2s67R20.net
勝手に察すると、単純な話だと思う
彼の把握では、おそらくは次のようになっているハズだ
内部関数=組み込み関数(あらかじめ用意されている標準の関数)
外部関数=自作関数、ユーザ定義関数
真意を勝手に忖度すると、「自作関数を作らずにそのまま使えるような便利な関数は既に存在してはいないだろうか」という質問に見える

555:デフォルトの名無しさん
18/09/18 09:40:00.14 GYwTywmv0.net
そもそも行数でどうたらって、いつの時代劇だよ

556:デフォルトの名無しさん
18/09/18 09:40:52.00 GYwTywmv0.net
>>542
俺もそう思った
だとすると536でFA

557:デフォルトの名無しさん
18/09/18 09:49:04.25 k3MAuD5K0.net
>>531
Yes、OK!

558:デフォルトの名無しさん
18/09/18 09:55:26.47 k3MAuD5K0.net
int ookii=...
int tiisai=...
int V=...
int x = std::max(tiisai,std::min(ookii,V));
ってやると、[min,max]区間内のVが取れたような気がする。
今度C++17で入るクランプがそれ。

559:デフォルトの名無しさん
18/09/18 11:57:01.55 9q1AFd5B0.net
>>543
>>512
>どんな場合でもリークしないように書けよ
リークしないようなコードを書くのは当たり前だが、どんなに注意してても起きるときは起きる
仮にこういう主張してるやつが居てもお前は俺と同じことを思わんのか?
「どんな場合でもバグらないように書けよ」

560:デフォルトの名無しさん
18/09/18 12:26:58.02 GYwTywmv0.net
車の事故と同じ
起きるときは起きるなんて言い訳は通用しない
まず起こすな
やっちまったら責任とれ
そういう緊張感がいるってことだ

561:533
18/09/18 12:44:39.79 TXDNyaJKM.net
ありがとうございます
max関数使わせていただきます
もう一つ別の質問なのですが、
2つのベクターの要素(1000個程度)の比較で、同じi番目の要素の内容差が10以上の要素番号(イテレータ?)を調べたいです
この操作は何回も繰り返すので出来るだけ高速化したいのですがなにか良い方法ありませんかね?
ベクターの要素はint型で内容は大体1000以下の整数です
vec1[100] = 100とvec2[100] = 300
vec1[102] = 100とvec2[122] = 300
なら100, 102のイテレータ(この後そのまま新しくforに投げるので)

562:デフォルトの名無しさん
18/09/18 13:14:20.96 l12yg0eyx.net
>>549
思わずC# LINQかPython使いたくなる内容だな。
やりたいことは結局のところ行列演算なのでEigen使うと何か方法ありそうだけど、高速化に寄与するかは不明。

563:デフォルトの名無しさん
18/09/18 14:20:03.27 Gab8FMClM.net
>>549
1000個を例えば4コアで250個ずつ並列化してさらにforの中でn個ずつ比較するとかかな…
intelは
_mm_cmpgt_epi16
armは
vcgt_s16
とかあるみたいだけど

564:デフォルトの名無しさん
18/09/18 15:33:22.77 UQgXz1AkM.net
普通MPIじゃね?

565:はちみつ餃子
18/09/18 16:41:03.37 CgLDhfQ00.net
>>549
新しく for に投げるっていうのがよくわからんのだが、
やりたいことをコードで (C++17 で導入された構造化束縛を使って) 表すと
for (const int& [element1, element2]: extract_if_big_difference(vec1, vec2)) { ほにゃらら }
みたいに書ける関数 extract_if_big_difference が定義できるといいなぁという感じ?
こうだとしたら、並列化するのは難しい気がするぞ。

566:デフォルトの名無しさん
18/09/18 16:42:40.86 l12yg0eyx.net
OpenCLでベクトル演算すれば速いんじゃね?

567:デフォルトの名無しさん
18/09/18 16:58:21.90 Zf2s67R20.net
こんなのだと速そうな気がする
vec3 = vec1 - vec2;
filter(vec3, 10, index);
void filter(const vector vec3, const int limit, int index[]){
int j=0;
for(int i=0; i<vec3.size(); i++){
if(vec3[i] >= limit){
index[j++] = i;
}else if(vec3[i] <= -limit){
index[j++] = i;
}
}
index[j] = -1;
return;
}

568:デフォルトの名無しさん
18/09/18 17:05:52.46 ZX8OqlLQd.net
データが多いならざっくり N (2~8)分割して OpenMP とかで並列処理するのがいいよ
数百ミリ秒以上かかるなら他のコアを遊ばせておくのはもったいない
各分割の結果は独立して保持して後で統合する

569:デフォルトの名無しさん
18/09/18 17:06:36.21 GYwTywmv0.net
>>549
vectorじゃなくvalarrayだが。。。
int main()
{
int const n = 10; //おまえさんのリクは 1000 だったな
//このへん前置きは置いといて
mt19937 eng;
random_device dev;
eng.seed(dev());
uniform_int_distribution<int> dis(-20, 20);
auto rnd = [&eng, &dis]() { return dis(eng); };
auto print = [](auto& ct) { for(auto& x : ct) cout << x << '\t'; cout << endl; };
valarray<int> vec1(n);
generate(begin(vec1), end(vec1), rnd);
print(vec1);
valarray<int> vec2(n);
generate(begin(vec2), end(vec2), rnd);
print(vec2);
cout << endl;
//ここが本題
valarray<bool> mask = abs(vec1 - vec2) >= 10;
vec1[!mask] = 0;
vec2[!mask] = 0;
print(vec1);
print(vec2);
}
差が10以上のところを探して何か処理ならこっちのが楽だべ

570:デフォルトの名無しさん
18/09/18 18:11:51.89 H2d9f0sTa.net
>>533の質問のレベルを見ていると、
>>549も「実装完了しないうちから最適化必要と思ってたけど実はそんなこと必要なかった」なんて落ちにはならないかなとふと思った。

571:デフォルトの名無しさん
18/09/18 18:32:34.48 RR2nvfojr.net
boost の multi_array ってさ、添字の入れ替えってできる?
例えば要素 a[i][j][k] を a[k][i][j] に、全ての i, j, k について入れ替える操作
自分で実装しなきゃ駄目?

572:デフォルトの名無しさん
18/09/18 23:03:47.37 oE0uJFU60.net
boostみたいなインチキくさいライブラリは使ったことないが
オレだったらイチイチそんなムダな入れ替えが本当に必要なのかと
まずそこを疑う

573:デフォルトの名無しさん
18/09/18 23:14:12.21 yg1A1NBg0.net
行列でそんな演算あったような

574:デフォルトの名無しさん
18/09/18 23:30:40.91 GKhblNvIr.net
>>560
無駄の意味が分からない
テンソルの掛け算するときに行列積ライブラリ使うために足組み替えたりするだろ

575:デフォルトの名無しさん
18/09/18 23:35:47.30 Re9liTgW0.net
できた!
template<typename T>
class MyMatrix3D : Matrix3D {
...
virtual T get(size_t i, size_t j, size_t k) {
return get(k, i, j);
}
...
};

576:デフォルトの名無しさん
18/09/18 23:43:07.71 G/V6WyhFd.net
stack overflow

577:デフォルトの名無しさん
18/09/19 00:26:11.52 McwJY1yY0.net
わ、わざとだから!

578:デフォルトの名無しさん
18/09/19 00:33:47.86 dEko0zDA0.net
boostとか漏れも使ったことないわ(゚∀゚)人(゚∀゚)ナカーマ

579:デフォルトの名無しさん
18/09/19 04:24:37.15 2wyJ7zTj0.net
boostはbjamが糞すぎて入れるのめんどくさくなっちゃった

580:533,549
18/09/20 03:07:15.61 fZtZJGAwM.net
遅くなってすみません
処理が重くなったのは別の部分のせいでした…
Python的考えで5桁くらいインデントしてたので勝手に遅いと思ってましたが普通に高速でした
お騒がせしました

581:デフォルトの名無しさん
18/09/20 13:40:29.54 CPfoYuVJ0.net
たかだか1000回のループでそんなに速度気になるんか(というか並列化とかベクトル化とか大げさやろ)、
と思ってたけどやっぱりか
>>558の一人勝ちやな

582:デフォルトの名無しさん
18/09/20 21:36:12.15 zLqp8E230.net
低学歴知恵遅れなら
1回ループするのに1分かかるようなコードを書きかねない

583:デフォルトの名無しさん
18/09/21 00:16:00.80 4kzBlK6i0.net
再帰使ってみたが1分かからんかった
ゆ、許された…
URLリンク(ideone.com)

584:デフォルトの名無しさん
18/09/21 00:27:26.94 4kzBlK6i0.net
1分の壁を破るには、何度も何度もそれとわからずに同じ計算をするようなアルゴリズムにしないとだめだなあ…

585:デフォルトの名無しさん
18/09/21 03:21:51.90 xr3UMDDx0.net
boostをVS2017に入れられない

586:デフォルトの名無しさん
18/09/21 13:11:38.33 JwHgudh+H.net
関数A,B、C、D、EがあってAの中でBを呼んで、Bの中でCを……
って構造があって、例えばEでエラーが出るとします。大本のAにそれを伝えてエラーにしたいんですけどどうしたらいいでしょう
BCDEの戻り値全部boolにしてfalseを返すくらいしか思いつかないです

587:デフォルトの名無しさん
18/09/21 13:20:30.45 EQpNFWj/0.net
>>574
戻り値でもいいし、引数に参照やポインタを渡してもいいし
例外でもいい

588:はちみつ餃子
18/09/21 13:40:44.63 FzfC+eZt0.net
書く分には例外を投げるのが楽じゃないの。
関数 B, C, D ではそのエラーについて忘れておくことが出来るので。

589:デフォルトの名無しさん
18/09/21 13:41:36.51 IFsUWHdO0.net
>>574
例外を投げてキャッチさせる

590:デフォルトの名無しさん
18/09/21 14:25:47.49 wDeX8uPc0.net
例外はGOTOに迫りつつある

591:デフォルトの名無しさん
18/09/21 14:34:59.25 lJw3kOTN0.net
>>574
典型的な例外の出番だ
void E() { throw std::runtime_error("error at E()"); }
void D() { E(); }
void C() { D(); }
void B() { C(); }
void A() { try { B(); } catch(std::exception& err) { std::cerr << err.what(); } }

592:デフォルトの名無しさん
18/09/21 14:47:07.50 JwHgudh+H.net
皆様ありがとうございました。
別関数からのまでcatchできるとは知りませんでした。>>574を参考にしつつ書いてみようかと思います。
ファイル読み込みのときはあんま例外使わないなんて記述見たんですけど別に書いても大丈夫ですよね

593:デフォルトの名無しさん
18/09/21 16:31:17.28 vcIlO6Gbr.net
スッゲェ素人なんだけどよ、他人が作ったクラスに自作関数を付け加えたいときってどうすんの?
(例えば、行列クラスに特異値分解する関数を付け加える等)
継承ってやつを勉強して使うだけ?
C++ の言語仕様と常識を勉強したいという意味でもあるので、「その他人のコードを直接編集せよ」ってのはナシで頼む

594:デフォルトの名無しさん
18/09/21 16:50:36.52 K+jLUYtn0.net
>>581
機能を追加するために継承使うのは設計的によくないよ

595:デフォルトの名無しさん
18/09/21 17:01:37.16 pko5dpD3r.net
>>582
どうするべき?

596:デフォルトの名無しさん
18/09/21 17:06:42.97 OnuHA6YMx.net
>>581
クラスの親子関係がはっきりしてるなら継承。
機能が似てるだけなら移譲。
どちらか迷ったら移譲。

597:デフォルトの名無しさん
18/09/21 17:15:33.49 K+jLUYtn0.net
>>583
void svd(Matrix &pMtx);
みたいな関数ではダメなの?

598:デフォルトの名無しさん
18/09/21 17:45:50.45 nytN4gJ8r.net
>>584
移譲という用語は初めて知ったので、勉強してみます

>>585
ダメ、ということはないと思いますしこれまではそうしてきました
しかし、行列の特異値分解は配列ではなく行列に適用するべきだという意識が強くなりました
BLAS 等の多くてややこしい引数も、「行列を渡す」という形で書くことでもう少し自分にとって読みやすくなるのではないかとも思いました
クラスだとか他人のコードの拡張といったことを勉強してみたくなったということでもあります

599:はちみつ餃子
18/09/21 18:21:14.81 FzfC+eZt0.net
>>586
なんでもかんでもメンバ関数として持たせるのはダサいというのが近年の風潮。
設計方針にもよるんだけど、機能をちょっと増やすたびに新しい型を作るのも馬鹿馬鹿しいだろう。
単なる関数として作ればそれでよいはずのことにクラスの依存関係まで出てくるの、ホントに良くない。

600:デフォルトの名無しさん
18/09/21 18:35:46.91 nikK7GUa0.net
>>584
>どちらか迷ったら移譲
やめろ、割とマジで
本来継承が好ましいものに委譲を使うと後々になって必ず破綻する
お前D&E読んでないのか?
>>587
>ダサいというのが近年の風潮
そういう言い方・考え方もやめろ
かつてC++の継承は汚いからテンプレートで代用しろ、みたいな理屈があったが全くの空回りに終わった
その間初心者は嘘の情報に騙されたりオブジェクト指向を誤解したりして、結果C++から離れていった
>単なる関数として作ればそれでよいはず
これは正しい

601:デフォルトの名無しさん
18/09/21 18:37:09.46 MaoTi4980.net
>>587
完全に同意。
クラスの数が星の数ほどあるプロジェクトで、継承してメソッド一個追加してるだけとかの経年劣化したソース見たら目眩がするわ。
オブジェクト指向の初期啓蒙として「既存のクラスは変更するな」「機能追加は継承使え」って言ってた人を恨むわ。

602:デフォルトの名無しさん
18/09/21 18:40:06.68 MaoTi4980.net
>>588
もちろん「IS-A」が成り立ってる継承が適してるものは継承使うべき。
むしろ継承を使うべきでないとこに継承使ってるほうが後々破綻するので悩んだら委譲。

603:デフォルトの名無しさん
18/09/21 18:53:16.27 nVnA1Sbpr.net
>>588-590
では特異値分解、スライシング、掛け算、足し算、エトセトラ……、という大規模な機能追加を既存のクラスに対して行ないたい場合はどのようにするべきでしょうか

604:デフォルトの名無しさん
18/09/21 19:06:55.02 MaoTi4980.net
>>591
うーん、場合によるけど全てそのクラスに対する操作ならさすがに継承するかな。
後々のメンテ考えたら可能であれば継承元のクラス変更するけど。

605:デフォルトの名無しさん
18/09/21 19:18:19.30 scCYqhjF0.net
他人が作ったクラスで勝手にいじれないんでしょ?
protectedやvirtualなメンバがあって、それを使って色々するなら当然継承すればいいけど
そうじゃない継承される前提で作られたクラスじゃないなら継承はオススメできんなあ
svd(m)をm.svd()って書きたいためだけに継承の山のようなトラップ抱え込むのは割に合わないと思うよ
どうせ親クラスのprivateはいじれないんだし

606:デフォルトの名無しさん
18/09/21 19:20:28.05 wzHnJ4yt0.net
unified call syntax 甦れ。

607:デフォルトの名無しさん
18/09/21 19:24:14.64 nikK7GUa0.net
>>591
使ってるのはuBLASだっけ?調べてないのでわからんけど・・・・
継承を前提にしたクラス(デストラクタがvirtualであり、実際継承してみても使える)なら継承もアリっちゃアリだとは思う
(責任は負わんw あくまで勉強目的でやってみるのはいいと思う)
ただ、特異値分解は知らんのでわからんけど、一般に演算クラスの機能追加は
>>587の言う通り、単純にそのクラスを受け取るグローバル関数にする方がいい
特に
>掛け算、足し算
こんなのはまさにメンバ関数にしなくても、グローバルに演算子オーバーロードを定義すれば済む
(メンバに書いてもグローバルに書いても利用者側はA * Bって書ける
あとv1.dot(v2)よりdot(v1, v2)のがわかりやすいと思うけどね

608:デフォルトの名無しさん
18/09/21 19:48:50.66 MaoTi4980.net
>>595
完全に同意。

609:デフォルトの名無しさん
18/09/21 19:58:47.83 nVnA1Sbpr.net
>>592-596
なるほど。
普通に関数にするのが、必要十分さの面で、良さそうですね。
頭の中にあったのは、自分で作った関数群が全て○○というクラスに対して使用することを想定している、と明示したかったということです。
グローバル関数の用途を明らかにする方法として、メンバ関数化すれば良いのかな、と思いました。
メンバ関数にはしないということにした場合、上のことを実現するにはどうするべきでしょうか。
コメントやノートに書くくらいしか思い付きませんが、それで良いのかな

610:デフォルトの名無しさん
18/09/21 20:09:39.68 scCYqhjF0.net
引数の型が○○やconst ○○&になるでしょ
それ以上のなにが欲しいの?

611:デフォルトの名無しさん
18/09/21 20:10:46.02 nikK7GUa0.net
そういえばBLASとは書いてたけどuBLASとは書いてなかったな
いずれにしても、その扱いたいクラスを受け取る関数だから見たらわかるっしょ
違う型を渡したらエラーになる

612:デフォルトの名無しさん
18/09/21 20:12:28.34 +2gqfJ3dM.net
>>597
どうでもいいけど最初と大分キャラ変わってるぞw

613:デフォルトの名無しさん
18/09/21 20:17:41.28 nVnA1Sbpr.net
>>598-599
わかりました。
確かに型を見たら自明ですね。
結局は
> svd(m)をm.svd()って書きたいためだけ
だったのかも知れません。
なんせそういう書き方はいかにも「ぽい」ですから。
ありがとうございます。

614:デフォルトの名無しさん
18/09/21 20:19:42.40 KRvbJL35d.net
>>601
横レスになるかもだけど多相的に関数の集合を規定したいなら[C++ traits]で検索すると幸せになれるよ
今回は不要だと思うけど後々欲しいなって思ったとき役に立つ

615:はちみつ餃子
18/09/21 20:43:37.20 FzfC+eZt0.net
>>588
いや、風潮っていうのは確かにあるよ。
かつて上手くいかなかったから今もダメとは限らない。
テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
それは >>602 がいうようにトレイトの活用の知見が蓄積してきたことで風向きが変わってきてる。
今はクソみたいな SFINAE と type_traits で不格好になんとかしてるのも
C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。
Rust や Go の隆盛でプロトコル指向への理解が深まっているというのもある。

616:デフォルトの名無しさん
18/09/21 21:06:19.19 nikK7GUa0.net
・・・・・俺が何を批判したかわかってないな
「ダサい」とか「風潮」じゃなくて、何故それが好ましいか、好ましくないか、
質問者のケースに合った説明をしろっつってんの
なんで当時の「テンプレートで継承の代用」の例を出したかわからんか?
代用にはなり得ないんだよ原理的に
実行時のポリモーフィズムをテンプレートで実現できるのか?
ユーザーの入力やファイルの内容に従って実行時に作るオブジェクトを変え、かつ
それを1つの型でまとめられるのか??
type erasure(boost::any含む)とかswitchとかif使う、とかは無しでな
自分の頭でその方法が合っているか合っていないか考えずに
流行とかに流された結果が、↑で挙げたソレなんだよ
C++潰したいのかよ

617:デフォルトの名無しさん
18/09/21 21:35:12.47 MaoTi4980.net
>>604
これも横からだが、C++はもう役割を終えて衰退機だと思う。
今から積極的にC++を採用する分野は限られていて、使えるor使おうと思うエンジニアの絶対数が減るってことは衰退と同義だと思う。
いろんな言語のエッセンスを学べるので悪い言語でないとは思うけど、誰かが言った通り習得のコストに見合ったメリットがない。
盛者必衰。

618:はちみつ餃子
18/09/21 21:55:31.46 FzfC+eZt0.net
>>604
> 何故それが好ましいか、好ましくないか、
> 質問者のケースに合った説明をしろっつってんの
それは >>587 の説明で足りないか?
風潮があって、その理由は不要な複雑さが出来るからだという説明で足りないか?
この説明は質問者のケースに合致してないか?
> 代用にはなり得ないんだよ原理的に
違う機能が違う能力を持つのは当たり前だろ? 説明するまでもなく。
どちらの機能を中心に活用した「設計」がよいのか�


619:チていう話じゃないか。



620:デフォルトの名無しさん
18/09/21 22:01:19.22 nikK7GUa0.net
>>606
ああすまん、確かに言葉尻に反応したところはあったな
でも「風潮」とか「ダサい」って蛇足だよな?w
ダサいって言いたかっただけやろ?
>違う機能が違う能力を持つのは当たり前だろ?
お前>>603
>かつて上手くいかなかったから今もダメとは限らない。
>テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
テンプレートを盲信してるようだから説明したんだが。
継承をテンプレートで代用せよ、ってのは間違ってない、って言いたかったんだろ?
>C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。
とか言ってる辺りからも、オブジェクト指向は過去のものだから継承も過去のものなんだぜ、とか
抜かしたかったのがわかる
マルチパラダイムの意味わかってる?

621:デフォルトの名無しさん
18/09/21 22:15:11.22 M9VunTBo0.net
継承をテンプレートで置き換えるって失敗したというよりもすでに当たり前になっただけでは
むしろそっちはそっちで発展してるし、動的でなくてもいいケースは確かに存在している

622:デフォルトの名無しさん
18/09/21 22:20:50.92 nikK7GUa0.net
>>608
静的に解決できるものならそうだろうな
そういうケースを否定はしてないが、当時はあちこちでそういう失敗例がドヤ顔で披露されてたんだぞ
禿も指摘してるようにJavaのせいだが

623:はちみつ餃子
18/09/21 22:46:33.24 FzfC+eZt0.net
>>607
> 継承をテンプレートで代用せよ、ってのは間違ってない、って言いたかったんだろ?
違うものは違う。 代用品ではない。
継承構造の代用品としてテンプレートを使えというのではなく、
テンプレートも前提のひとつとしたデザインにしろと言ってんの。
「なにもかもをメンバ関数にするな」というのは全て非メンバ関数にしろっていう意味じゃないだろ。

624:デフォルトの名無しさん
18/09/21 23:01:04.77 nikK7GUa0.net
>>610
>>603
>かつて上手くいかなかったから今もダメとは限らない。
>テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
>それは >>602 がいうようにトレイトの活用の知見が蓄積してきたことで風向きが変わってきてる。
って言ってるよな
「かつて上手くいかなかった」って、
俺の「かつてC++の継承は汚いからテンプレートで代用しろ、みたいな理屈があったが全くの空回りに終わった」
のことだろ?言い逃れしてんじゃねーよ

ちなみに継承をテンプレートで代用、を挙げたのは、それに初心者が惑わされたからだ
ただのテクニックの紹介ではなく「C++の継承は汚い」みたいな暴言を伴ってな
お前が「ダサい」とか「風潮」とか、自分がドヤりたいがために選ぶ言葉と同じだよ
>「なにもかもをメンバ関数にするな」というのは全て非メンバ関数にしろっていう意味じゃないだろ。
質問者の「関数追加」の方法についてはお前の意見に賛同してるだろうが

625:デフォルトの名無しさん
18/09/21 23:02:28.75 ZQgI79kj0.net
質問者を放置してドヤ顔で語るオタクたち

626:デフォルトの名無しさん
18/09/21 23:10:39.91 nikK7GUa0.net
あ、ついでに言うと
>言語そのものとしてのサポートが不充分だった
ねーよ
C++98~03でも十分メタプログラミング出来てたぞ(11から確かに幅は広がったが
STLしかりModern C++ Designの著者のLokiしかり
Boostだって当時からあったからな

627:デフォルトの名無しさん
18/09/21 23:26:46.84 wfTNvghC0.net
>>605
C++に挫折でもしたの? w
ネイティブコード吐けるオブジェクト指向言語ってそんなに選択肢ないし

628:デフォルトの名無しさん
18/09/21 23:30:11.36 wzHnJ4yt0.net
FixedC++であるRustに期待はしているが・・・。

629:はちみつ餃子
18/09/21 23:41:33.16 FzfC+eZt0.net
>>611
なんでその結論に納得できるのに前提に色々言ってんだ?
テンプレートについてはそっちが言い始めたことで、別の話題だろ?
代用という言葉の使い方がちょっとずれてるだけじゃないの。
そのまま置き換えれるかという意味では代用できないし、
継承でなんとかしてたデザインをテンプレートを活用したデザインに置き換えられる (こともある)
という意味では代用ともいえる。
言葉については、「ダサい」はともかく、「風潮」に何か問題あるか? それは全くわからんな。
デザインの風潮というものは間違いなくある。

630:はちみつ餃子
18/09/22 00:00:10.67 cynlNZMd0.net
>>613
無理無理。
今だってろくでもない回りくどい仕組みでどうにかこうにか
型の制約を表現できてるってだけだもの。
初心者にそれを元にデザインさせるのは無理。
型の制約についての知見とは別に C++ の言語機能が足りてない。

631:デフォルトの名無しさん
18/09/22 00:04:20.29 0je8S2eS0.net
>テンプレートについてはそっちが言い始めたことで
ダサいとかイケてるとか風潮とかで設計を語るからだよ
お前の説明はだいぶ甘い、自分でよくわかってないものを押し付けてないか?
そういう傾向を指摘されたって気づいてるだろ?
自分のコーディングの経験が足りてないゆえに、はっきり断言できないから風潮とか出てくるんだろ?
さっさと謝ってりゃここまで言ってないんだがな
>デザインの風潮というものは間違いなくある。
そう思ってんのはお前らアマチュアだけだから。(特にお前の思ってるようなデザインについては)
>>617
何の話してんの?コンセプト?w
なんで初心者がまだ導入されてないコンセプト前提の設計しなきゃならないの?馬鹿なの?
コンセプト入ったら実行時のポリモーフィズムをテンプレートで出来るの????wwwwww

632:デフォルトの名無しさん
18/09/22 00:11:49.56 vYximTvP0.net
最初はもてはやされたけど、みんな知ってる前提になったら特に触れられもしなくなった
風潮ってこいうのだろw

633:デフォルトの名無しさん
18/09/22 00:12:42.81 0je8S2eS0.net
すまんちょっと熱くなりすぎた
論破されたことに気付かないアホ(あるいは謝ったら死ぬ病)相手にするとキリが無いわ・・・・
もうやめとく

634:デフォルトの名無しさん
18/09/22 01:40:05.82 3xdfFsZb0.net
権限の委譲というと良いものを与えているイメージだが
UML用語の委譲はどうみても仕事の丸投げとかたらい回しな印象であるイメージ
な気がする

635:572
18/09/22 02:14:06.30 3xdfFsZb0.net
昨日のプログラムを改良したったwwwww
URLリンク(ideone.com)
データ数N=300のときCore i7-860 (2.8 GHz)で8秒かかる。idoneのやつでも5秒。
N=1000だと宇宙の終わりまでかかる予定。
これで漏れも低学歴知恵遅れに晴れて仲間入りDA☆NE!


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch