1 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 10:57:31.60 ID:JaaB5Egp.net] 前スレ C++相談室 part156 https://mevius.5ch.net/test/read.cgi/tech/1621389313/
2 名前:デフォルトの名無しさん [2021/08/09(月) 11:24:40.26 ID:M3I2CbwW.net] 前スレの >>997 キューが溢れないようにするのなら スレッドが実行中かどうかを確認するのではなく キューサイズを見るほうが確実じゃないですか?
3 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 11:43:30.76 ID:GC6B710d.net] >スレッドが実行中か確認したいってどんなときなのかな? たとえばゲームでセーブするとき、 メインの処理はブロックしたくないので別スレッドで実行しつつ「セーブ中です」みたいな表示を出し、終了したら消す みたいな時かな
4 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 11:48:24.98 ID:OWI9S7jW.net] >>3 それはセーブするスレッドのほうが開始と終了を通知すればよくない? そうデザインするもんじゃないの? できないときもあるのかもしれんが。
5 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 11:56:53.44 ID:GC6B710d.net] >>4 もちろん方法ならいくらでもあると思うけど、別スレッドのインスタンス1つで全部済むなら、そっちの方がすっきりするし楽でしょ
6 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 12:12:57.14 ID:GC6B710d.net] >>4 ,5 あぁ、いやそうじゃないか ゲームのあらゆる部分をスレッドセーフで設計すれば良いのかもしれないけど、 ゲームのメインの状態遷移なんてわざわざマルチスレッド化するような重い処理でもないので、 その辺の表示とかはシングルスレッド前提で書いてるわけよ、もちろんそのほうが楽だからw
7 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 12:17:21.54 ID:qYrd5+ip.net] この「実行中」が実際にタイムスライスが割り当てられている状態を意味しているんであれば OSにもよるが実装が大変な割に実際に役立つシーンは限られるような。 >>4 であればjoinableで十分だろうし。
8 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 12:25:08.93 ID:DVzh2mox.net] 別スレッド処理の進捗を他スレッドから閲覧するためのパラメータを使っってる時点で、お察し
9 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 12:40:21.77 ID:S8n0VVLE.net] 前スレ997は色々勘違いしてそうな気がする 普通pushしようとしてキューが満杯なら何らかの同期メカニズムで自分を待ち状態にする pop側はpopしたらその同期メカニズムに対して待ちを解除するだけだからスレッド自体が実行中かどうかなんて見る必要がない
10 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 13:35:16.98 ID:eF2Q2UUf.net] std::condition_variable
11 名前:ハノン mailto:sage [2021/08/09(月) 13:52:46.20 .net] 正直いって pthread の条件変数は私には理解が難しく、私は安易に win32api のクリティカルセッション&シグナルを多用してしまうのです ただし、スタベーションに陥ることが多々あり、どうもクリティカルセクション・シグナルでは駄目なパターンがあるかもしれない、とヒヤヒヤしています‥‥
12 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:01:28.39 ID:TRAo/ccI.net] >>2 別に Producer(pushする側)がこれからpushするのを待っている場合、 Consumer(popする側)はキューサイズ(キューの中の要素数)を見ても Producerが待っているのかどうかの情報を得られない なぜなら、まだpushしていないからな
13 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:14:45.62 ID:TRAo/ccI.net] >>9 >pop側はpopしたらその同期メカニズムに対して待ちを解除するだけ そういう実現方法も(pop側が行った待ち解除がキューイングされれば)成立する鴨、と>>997 にちゃんと書いているもーん
14 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:32:36.91 ID:JaaB5Egp.net] >>5 >>4 って新規スレッド1個で全部済むと思うんだけど……
15 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:33:19.09 ID:S8n0VVLE.net] >>13 いや、スレッドの実行状態なんて見てもしゃーないって話 pop後にpush側が実行中だとしてもそのチェック直後にpushするかも知れん 要するにスレッドの実行状態の変化は排他制御できないから意味がないって話 pop前にいちいちスレッドをsuspendしてチェックしてからresumeするとかするならできるかもしれないけどw
16 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:34:07.65 ID:aCXIbwxy.net] std::vectorの部分ベクトルの切り出しって絶対O(要素数)の計算量かかりますよね?
17 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:40:14.51 ID:fi8SjIox.net] 「部分ベクトルの切り出し」とは何かを定義せよ。
18 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 14:47:54.30 ID:eF2Q2UUf.net] こういうの? std::vector<int> a{ 4, 6, 4, 9 }; std::vector<int> b(a.begin() + 1, a.begin() + 2);
19 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 15:11:52.58 ID:KzU8BZnC.net] 参照できればいいのか、コピーがいるのか、切り出し位置はわかってるのか、検索を伴うのか、 その辺の条件もなしに計算量の議論なんて出来んわ
20 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 16:11:11.49 ID:6v1cUfUr.net] クラスAの内部にクラスBがある (入れ子クラス) として、BからAのメンバにアクセスするテクってないんですかね? アクセスしたいメンバをstaticにはしたくないです
21 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 16:20:25.36 ID:GC6B710d.net] >>20 AへのポインタをBに定義して、コンストラクタかなんかで渡せばいいのでは?
22 名前:はちみつ餃子 mailto:sage [2021/08/09(月) 16:48:43.56 ID:OWI9S7jW.net] >>20 クラスの中でクラスを定義しても A の名前空間の中に B が定義されるってだけ。 B のオブジェクトを作っても A のオブジェクトが存在しないなら存在しないオブジェクトのメンバにはアクセスできない。 A のオブジェクト (インスタンス) と B のオブジェクトの間には勝手に関係が出来たりもしない。 関係ないのに関係あるように見えて初心者が混乱してるのはどっかの質問サイトでも見たことがある。 よく理解できてないならまずはクラスの定義を入れ子にせずにやってみるのがオススメ。
23 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 16:52:51.13 ID:S8n0VVLE.net] >>20 AやBのインスタンスをどう生成してるのよ >>21 の言うようにAへのポインタ持ってたら普通にアクセスするだけでしょ class A { public: int i; class B { public: B(A* a){ … = a->i; } } } … auto b = new A::B(new A());
24 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 16:59:35.77 ID:eF2Q2UUf.net] >>19 コピーか参照かは1要素あたりの処理量なので コンテナの計算量には関係ない
25 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 17:00:48.11 ID:hJGoZPOe.net] 絶対レビュー通らないウンココードでよいなら (char*)this + offsetof(A, b)でなんとかならんのか
26 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 17:33:38.90 ID:GC6B710d.net] class Aをtemplate化して、class BでAを継承すれはメンバにはアクセスできるけど、たぶんそういうことがしないんじゃないんだろうなw コンテナクラスのイテレータから親クラスインスタンスのメンバにアクセスしたいとかか?
27 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 17:48:31.00 ID:eF2Q2UUf.net] リファレンサを作るときなんか親オブジェクトへのポインタ使うね
28 名前:デフォルトの名無しさん mailto:sage [2021/08/09(月) 20:07:17.09 ID:XVy1LhuX.net] >>23 普通にコンポジションで実現できる条件だよな メルプラネットの奴らも同じこと言いそう
29 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 00:55:38.92 ID:rk6SLsdN.net] 親オブジェクトへのポインタをうっかり共有ポインタにすると循環参照の原因になる(小並感)
30 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 03:53:30.08 ID:mPLpHQ1a.net] +=の引数が1のときは++を呼ぶようにする方法ってありますか
31 名前:ハノン mailto:sage [2021/08/10(火) 04:41:55.83 .net] >>30 自分でそう書くのがいいのでは? (n == 1) ? x++ : x += n;
32 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 08:16:11.83 ID:JssHBcjd.net] >>30 遅くなる可能性があるから気にしない。 コンパイル時に解決できるなら++使っても同じだし、実行時に解決するようだと1かどうかの判定が増えて遅くなる。
33 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 12:11:16.71 ID:OMlKC5pQ.net] TCPIPのソケット通信プログラム作ろうと思っているのですが、 コネクションを維持し続ける場合のデメリットって何がありますか?
34 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 12:42:43.27 ID:ZRv1Vy3I.net] >>32 後出しになって申し訳ありませんが、*、!=、++、+=、- 辺りが定義されたイテレータを持つ自作のデータ構造を範囲for文で走査することを考えています それ自体は想定した通りにできたのですが、その範囲for文をomp並列化するとイテレータのインクリメントが ++ でなく +=1 で行われるようになります で、その自作データ構造では ++ よりも += の方が重い実装になっているので、+=1 よりは ++ の方を使ってほしいです omp に特有の仕様に思えるので、普通に += の冒頭で引数が1かどうかの分岐を入れることにしようかと思います ありがとうございました
35 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 14:57:46.78 ID:W7aMf5pX.net] マルチスレッドのキューのサンプルをSTLで作りゃったーしたったわ、 https://ideone.com/bS7rqc ↓ここのC#のサンプルプログラムの移植 // https://atmarkit.itmedia.co.jp/ait/articles/1801/31/news023.html フラグの必要性は意味を取り違えていたわサーセン、 しかしこれフラグ(runningFlag)無しでやるとしたら終了時にConsumerがいちいちProducerが join可能か調べる(std::thread::joinable())ことになってスレッドより先にプログラムした人が終了したくなるお フラグで済むのに、
36 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 15:21:27.23 ID:W7aMf5pX.net] Windowsのイベントオブジェクトと条件変数の違いまとめ https://dev.activebasic.com/egtra/2011/09/19/413/
37 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 15:28:07.54 ID:W7aMf5pX.net] と思ったがやっぱ当初の意味(Producerが待っているのかどうか)のフラグが無いと、 キューが空になった後のnotifyで、1万個あるかもしれない仕事の無いConsumerが次々起床され、 巡り巡ってようやくProducerが起床されるみたいな非効率が生じる余地があるやんけ;;; やっぱ当初の漏れのフラグ必要という意見で正しかったのかもしんない 漏れは天才なのかもしんない、 かもしんない運転、
38 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 18:25:35.80 ID:W7aMf5pX.net] つかその前に、漏れの天才eyesが改造元とした@IT様のサンプルプログラムに スレッドのディスパッチ依存で終了できなくなることがあるという恥ずかしいバグを発見した、 論より証拠: https://ideone.com/NbKdEQ 変更点は、Consumerを1個にして、Producerの側のある個所にsleepを入れただけ (マクロ CAUSE_STOPPING_FAILURE_BUG で条件コンパイルで有効にしている個所 これでConsumerスレッドが終了できなくなる 対策は、同ソースコードの BUGFIX_STOPPING_FAILURE_BUG マクロを有効にしたら宜しい 天才の判断である
39 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 18:42:35.68 ID:mYAwPqTL.net] >>34 すみません。この件なんですが、 void operator += (int n){ if(n == 1){ // ここ }else{ …… } } 「ここ」で演算子++を呼びたいときってどう書いたら良いでしょうか ++の中身をコピペしても良いのですが、 this -> ++ みたいなノリで呼び出せた方が都合が良いです
40 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 19:06:35.71 ID:W7aMf5pX.net] というわけで最終的な版を貼る、 https://ideone.com/G3XeAg ProduceとConsumerそれぞれに対する起床条件を分離すた、 日本語ではいくら説明しても一向に理解の光が射さなかったボンクラ学生レヴェルの>>15 でも 100行足らずのソースコードなら読めるんじゃないの 知らんけど
41 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 19:11:32.09 ID:cMFKuo8t.net] >>39 ++(*this); または this->operator++();
42 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 19:24:28.15 ID:mYAwPqTL.net] >>41 ありがとうございます 前置/後置の別が自分の中でよく付いていませんが、教えていただいたことに基づいて調べてみます
43 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 19:37:16.72 ID:Lbev+Y0v.net] >>40 で、そこで取れると良い「スレッドの実行状態」って結局何なん?
44 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 20:32:27.09 ID:W7aMf5pX.net] 「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や とれると良い、ではなく取ることが必須や なぜなら、WIN32APIのイベントは1回だけキューイングされるので投げたら投げっぱなしでもそのうち 受け取ってもらえるが、(pthread系統のしくみである)状態変数はそうではなく、 起床信号を投げつける前に相手が信号をキャッチ可能なのか(待ちに入っているのか)知る必要がある なお、イベントのキューイングの有無によって話が変わる旨はすでに書いたある(>>997 上記のことを書いてあるというのに理解もせずにしつこく同じことを繰り返し言ってきたのが>>15
45 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 21:01:08.35 ID:Lbev+Y0v.net] >「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や それって具体的にどういうものを想定しているんだろう。 もともとの話はstd::threadに追加したい機能だったと思うけど、この説明だけじゃ全然想像がつかない。
46 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 22:11:54.85 ID:W7aMf5pX.net] なんか元にしたコードにまだ問題があった気配orz MAX_QUEを1にすると高い頻度でProducerとConsumerが両方待ちに入ってしまいハングアップする、、、 対策版は多分これ↓で良いんジャマイカ…… https://ideone.com/at7ef9 (何が起きていて、どうしてこれで対策なのかはコメント参照、 >>45 >>「スレッドの実行状態とは起こす対象のスレッドが具体的に何をしているか、や >それって具体的にどういうものを想定しているんだろう。 今回のサンプルコードでは具体的にはありません(キリ しいて言えば!runningFlagならConsumerが自身を待ちに入れない(∵Producerがもう起こしてはくれない というのはあるが、>>35 に書いた通りフラグ以外の方法でも同じ判定を行える 言っていることにブレがあるのは今日pthreadを勉強したばっかりやし、 天才なので大目に見てホスイ、
47 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 22:25:26.70 ID:W7aMf5pX.net] でもまあコメントを読んでいただければ、pthread系のしくみだと 起こす対象のスレッドが何をしているのかについて常に配慮が居るということをご理解いただけるのではないかと思う 今回はたまたま見込みでnotifyして話が通るからスレッドの実行状態を表す変数が具体的に生じなかっただけ
48 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 22:47:59.90 ID:C0wcAbjz.net] すみません。 自作プログラムが特定のPCだけ同じ場所でntdll.dllのエラーで止まるのですが、何が原因と考えられるでしょうか? 他のPCでは問題無く進み、エラーを起こすPCのメモリにも異常は見つかりませんでした。
49 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:06:02.90 ID:OOQ3UOoB.net] >>48 未初期化変数があって無効なアドレスにアクセスしたとかじゃね 確実なことを言うためには例外コードが知りたい あと問題の箇所のソースコードも
50 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:24:57.75 ID:C0wcAbjz.net] ソースはすみません、ちょっと出せないです エラーコードは0xc0000005でしま
51 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:30:51.53 ID:OOQ3UOoB.net] はいメモリアクセス違反ですね デバッガでがんばって調べてね
52 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:32:41.60 ID:C0wcAbjz.net] あざす
53 名前:デフォルトの名無しさん [2021/08/10(火) 23:34:52.75 ID:5fGESjxl.net] 他の言語にはスレッド実行中か判定するAPIあるしstd::thread作った人達だってそのくらいのこと知ってたでしょ boost::thread時代にそういった要望もあっただろうし それでもあえてstd::threadにはスレッド実行中を調べる機能を付けなかった 本質的に必要な機能ではないと判断したんじゃないの?
54 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:44:13.15 ID:rk6SLsdN.net] スレッドそのものの終了状態を知る需要はあまりなく、スレッド内で行われるユーザー定義処理が終わったかどうかが重要だからでしょ
55 名前:デフォルトの名無しさん mailto:sage [2021/08/10(火) 23:50:54.98 ID:Lbev+Y0v.net] >>47 >起こす対象のスレッドが何をしているのかについて常に配慮が居るということをご理解いただけるのではないかと思う それがwaitで待っている状態かそうでないかを意味しているんだとしたらそれは正しくない。 チェックした次の瞬間にwaitする可能性もあるわけなんで。
56 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 01:24:38.33 ID:qkzYmFIh.net] >>55 >チェックした次の瞬間にwaitする可能性もあるわけなんで。 無い チェックと処置をmutexによる単一のロック期間の中でアトミックに行うのだから>>55 は全くナンセンスな問題提起 >>53 thread::joinable()があることは書いたもーん
57 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 01:28:13.23 ID:qkzYmFIh.net] 問題だらけだった@IT様のサンプルコードだけど これまともに実装するとしたら条件変数をConsumer x NとProducerの計N+1個設けて、 さらにConsumerそれぞれが待っているのか動いているのかを示すフラグを設けて 全部動いていたらProducerを待たせる Consumerが待ちに入る直前にProducerにnotifyかけてキックする、みたいな スレッドプールを手で実装するみたいな話になりそう…… でここまでやるならConsumerの状態変数が実体としてコードに現れる
58 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 01:44:51.77 ID:01hIEDa4.net] 何を主張したくてごちゃごちゃ言ってるのかさっぱり見えないし途中で変わったりしてるようでもあるので、 続けるならそもそもどういう主張をしているのかいっぺんまとめてほしい。
59 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 08:13:22.18 ID:SyYdmIb8.net] >>56 std::threadから取得する「スレッドの実行状態」の話をしているんだが。 それをmutexでアトミックに操作する???
60 名前:デフォルトの名無しさん [2021/08/11(水) 09:56:36.95 ID:8ERcfmko.net] C++ってiPhoneアプリ作れる?
61 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 12:11:01.26 ID:sOdrsbt7.net] >>60 作れる。QtやUnityで。
62 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 12:13:04.52 ID:sOdrsbt7.net] iPhone専用でいいなら、そもそも、Appleが提供している標準開発環境だけでも C++で作れる。 iPhoneの標準開発言語はSwiftだが、SwiftはC++と相互に呼び出せるから。 ただし、それだけだと面倒かも知れない。 そういう場合は、Qtで作れば。
63 名前:デフォルトの名無しさん [2021/08/11(水) 12:52:41.17 ID:MU7UJMps.net] std::vector で insert するとき v.insert(v.begin() + n, hoge); とかすると思いますが このときの n の型って何ですか? int ? unsigned long ? size_t ? あとこういう型を調べるときって vector のどことか iterator のどこを調べると判りますか?
64 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 13:03:37.14 ID:19rzwYjH.net] 22.3.11 Class Template vector 23.3.11.1 Overview 3 using iterator = implementation-defined; //see 22.2 となっていて、std::vector::iteratorの型は処理系定義だね 現物で調べるならVisual Studioの[F12]が簡単だと思う
65 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 14:01:06.77 ID:OqxISI0I.net] >>59 ID:W7aMf5pX = ID:qkzYmFIh はスレッドの状態として ・その瞬間の状態: Run/Ready/Wait/... ・終了してるかどうか: thread::joinable で取得できる を混同してる(わざとかどうかは知らんが) あと条件変数とスレッドの状態も混同してるので > チェックと処置をmutexによる単一のロック期間の中でアトミックに行うのだから なんて意味不明なことを言い出してる これ以上続けるなら>>58 が言うように本人にまとめてもらわないとますますグダグダになるだけだと思う
66 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 14:15:21.29 ID:EWMgwFeS.net] std::thread使ったことないから自信無くて黙ってたけど thread::joinable()って別にスレッドが終了したかの判定ではなくない? 他スレッドでの実行を管理していない状態の(空の)オブジェクトが作れるから、そういう空の状態かどうかの判定関数であるように読めた fstream::is_open()的な……
67 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 14:23:39.88 ID:01hIEDa4.net] >>63 暗黙変換があるから n の型としてはすべての整数型があり得る。 基本的には、生ポインタで実装される可能性もあるものなので ptrdiff_t だと思っておけばいい。 正確な型が必要なら difference_type とか iter_difference_t とかで調べればわかる。
68 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 14:56:54.71 ID:OqxISI0I.net] >>66 > thread::joinable()って別にスレッドが終了したかの判定ではなくない? もちろん正確にはスレッド変数がスレッドと関連づいてるかどうかの判定 彼は>>35 辺りでスレッド終了判定と思い込んでるフシが見られるのでそう書いてある
69 名前:デフォルトの名無しさん [2021/08/11(水) 15:08:15.20 ID:MU7UJMps.net] >>67 ありがとうございます >>64 >現物で調べるならVisual Studioの[F12]が簡単だと思う それで判るのは自分で定義した可能性の高い n の型ですよね? 知りたいのは v.begin() + n に要求されている型のことです
70 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 15:28:09.46 ID:EWMgwFeS.net] >>68 やっぱりそうですよね じゃあ>>65 の2個目の中黒の内容については引用?? 例のコードではjoinableなんか使ってないし>>7 が書いたのを試しもせずに真に受けた感じなのかな
71 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 15:29:37.31 ID:EWMgwFeS.net] >>69 v.begin().operator+(n)とでも書き換えてoperator+で[F12]しろということではなかろうか
72 名前:はちみつ餃子 mailto:sage [2021/08/11(水) 15:43:43.66 ID:QcAq7ivU.net] >>69 ランダムアクセスイテレータには difference_type (またはそれに暗黙に型変換出来る何か) を足すことができて、 その結果の型はイテレータ自身と同じ。 https://timsong-cpp.github.io/cppwp/n3337/random.access.iterators
73 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 15:52:06.26 ID:SyYdmIb8.net] >>66 >thread::joinable()って別にスレッドが終了したかの判定ではなくない? 実際にそのスレッドが実行中か待ちか終了しているかを表しているわけじゃないことはその通り。 で、たぶんそれで十分だからjoinable以上の機能は用意されなかった。 ところがそれが役に立つ場面があるよと言ったのが前スレ>>997 このスレの>>35 と同一人物かどうかは知らんが。
74 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 15:54:21.05 ID:19rzwYjH.net] >>71 そういうこと
75 名前:デフォルトの名無しさん [2021/08/13(金) 02:38:58.72 ID:tLa9gek2.net] char *mystrcat(char *a, char *b) { // a に b を結合して return a; } みたいな関数を shared_ptr<char *> mystrcat(shared_ptr<char *> a, char *b) { // a に b を結合して return a; } みたいな実装にするとき参照カウンタが無限に増える心配はありますか? shared_ptr<char *> mystrcat(weak_ptr<char *> a, char *b) の方が良いのでしょうか? あと hoge = mystrcat(NULL, hage); みたいに使用されるときは mystrcat の中で new してコピーして new したポインタを返したいのですが問題ありませんか?
76 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 02:56:15.88 ID:nopi39s7.net] >>75 shared_ptr<char *> だと、たぶんやりたいことはできてない。 shared_ptr<char[]> の間違いなんだろうと思うけど、この時点でコンパイルすら試してないのが見て取れる。 参照カウンタの動きは挙げられたソースだけじゃ読み取れないけど、無限に増えるなんてことはまず起こらない。 shared_ptr の use_count() で取れるから試してみればいい。 問題があるかどうかも自分で試してみればいい。何を「問題」とするかこちらにはわからないし。
77 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 09:51:25.31 ID:BE9FMbqU.net] 個別の事例で心配ない、問題ないという返答を得たとしても理解が深まらない。 shared_ptr のメカニズムを理解できないと何度でも心配になるだけ。 どういう理屈で参照カウンタが無限に増えると思ったのかを説明してみて。 考え方に間違いがあれば指摘するよ。
78 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 11:40:57.21 ID:UG8FRdqC.net] char *mystrcat(char *a, char *b) { // a に b を結合して return make_shared<char []>(a); } じゃいかんの しらんけど
79 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 14:30:41.36 ID:vEVo7A6C.net] 適当な質問者と適当な回答者 ゴミとゴミをあわせてもゴミはゴミ
80 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 18:27:35.00 ID:tLa9gek2.net] shared_ptr<char []> c(a); return &c[0];
81 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 08:57:21.71 ID:dlgzlAXX.net] namespaceってどのように使うものなんですか? 存在意義がわからない。
82 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 09:56:52.00 ID:2Gpa2MRC.net] >>81 大規模ライブラリを設計するときに重宝する機能 詳しい経緯は知らないがグローバルスコープの識別子名の競合を回避する目的で導入されたと思う namespaceがないC言語時代にいくつからの大規模ライブラリを組み合わせたときに何が起きがちだったか知っていれば納得出来るはず どんな機能もそうだが、自分が必要と思った時に使えば良いだけだよ 存在意義が分からないならお前にとっては必要のない機能ということだから、気にする必要はない
83 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 10:45:32.18 ID:MjnqNUAd.net] Cにnamespaceが導入されないのは何故なんです?
84 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 10:48:18.77 ID:isR1pnnS.net] >>75 蛇足だけど、理由がなければshared_ptr<char[]>の代わりにshared_ptr<str>にしたほうがいいな。 // a に b を結合して return a がすごく怖い。
85 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:05:20.03 ID:HmVXtcJk.net] >>83 namespace
86 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:07:32.50 ID:HmVXtcJk.net] >>83 namespaceを導入するということは :: だのマングリングだのADLだの色々付いてくるからな
87 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:09:29.69 ID:sh47n3w4.net] >>83 マングリングが必要になってしまうから、ってのが大きいだろうな。
88 名前:デフォルトの名無しさん [2021/08/14(土) 11:16:28.29 ID:Wd8wuOU/.net] C++を本格的に学ぼうと思って本を数冊買ったが、言語仕様が複雑な割には知らないとエラー起こすだろ っていう項目が多くてビビってる。あと、きれいなコードを書くのに尋常じゃない経験が必要なんじゃないか
89 名前:はちみつ餃子 mailto:sage [2021/08/14(土) 11:34:44.96 ID:xM4RG8+9.net] 全部知らなくてもわかる部分だけでまあまあ使えるというのが C++ の方針なので 最初から綺麗に書こうと思わないほうがいいと思う。 綺麗に書けないと考えるより汚くても普通なんだと考えると気が楽でしょ。
90 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:41:20.52 ID:HmVXtcJk.net] 構造体の中に関数が書ける、というコアの中のコアな部分の使い方・考え方さえ憶えるというより慣れれば あと他のは追加で憶えればいいってだけ ただし、その追加が今とんでもない量になってて 禿本の初版からやってる俺でさえ憶えきれなくてもがいてる
91 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 11:47:19.11 ID:fhp8ilcT.net] いいかい学生さん、 他人のコードをな、 他人のコードをいつでも読めるくらいになりなよ。 それが、人間えら過ぎもしない貧乏過ぎもしない、 ちょうどいいくらいってとこなんだ。
92 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 13:15:40.19 ID:MjnqNUAd.net] >>88 エラーが起こったらまだマシだな イクときはだまってイクからな
93 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 13:23:47.33 ID:sh47n3w4.net] 他人のコードを読んで学ぶのに一番向いてない言語だよなC++は。
94 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 13:48:08.91 ID:fhp8ilcT.net] オーバーロードが悪いんですよ
95 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 14:19:07.48 ID:EcmTnCEO.net] >>93 perl に比べたらまだマシ
96 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 17:38:14.88 ID:sh47n3w4.net] perlは文法が複雑なだけで、知らない書き方に出会ったらそれを調べればいい。 C++はコードの断片だけ見ても動作を想像できないことがあるから厄介。
97 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 18:45:25.98 ID:lbIZmRLc.net] ぶっちゃけスマートポインターって面倒だよね?
98 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 18:54:41.75 ID:fhp8ilcT.net] スマポに限らず面倒なテンプレートクラスだらけだよ
99 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 18:56:25.80 ID:fRH2bKcn.net] ぶっちゃけどんなときに面倒だと感じる?
100 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 19:58:29.67 ID:x6Wgppy9.net] スマートポインタに慣れたら自分で解放しなきゃならないmallocやnewの方がよっぽど面倒
101 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 20:04:27.45 ID:HmVXtcJk.net] >>98 クラステンプレートな
102 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 21:41:33.25 ID:fhp8ilcT.net] autoが便利すぎて反復子の型を明示していたころのC++には戻れそうにない
103 名前:デフォルトの名無しさん mailto:sage [2021/08/14(土) 22:18:40.56 ID:cML6JT7R.net] 11よりは前は書きたくないね
104 名前:デフォルトの名無しさん [2021/08/15(日) 00:20:00.85 ID:YeWgyy60.net] QZ案外初心者やなw でも言ってることは全面的に賛成 ポインタや参照、クラス等の基本を抑えてからでないとスマポや、C++11からの要素(右辺値参照含む)の使い方もわからんと思う
105 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 06:30:24.80 ID:AkVzvB4L.net] autoもそうだが ->戻り型やusingエイリアスもだね typedefには戻れない
106 名前:ハノン mailto:sage [2021/08/15(日) 09:34:41.47 .net] >>103 確かに罰ゲームの一種になるかも‥‥私も少しずつ採り入れていくようになっていますし >>104 もう永遠の初心者だと思っていますので、ならば、初心者の気持ちがわかるコメントでコントリビュートするのもありかと、ふつふつと
107 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 14:37:33.11 ID:Qb5ISoeo.net] >>104 なにこれ? QZ「〜」 名無し「QZ初心者やな。でも賛成」 っていう自演をやろうとしたが、一個目のQZのレスをコテつけ忘れで投稿してしまったのか? あるいははちみつとQZを同一視している? いずれにせよとんでもない皮肉だな笑
108 名前:ハノン mailto:sage [2021/08/15(日) 15:29:20.83 .net] >>107 いちいち反応しなくてもよろしい >>108 つ鏡
109 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 17:48:49.44 ID:pJ9UilRh.net] >>107 それ、以前俺が書いたカキコを勝手にコピペされただけだよ
110 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 17:52:57.61 ID:/OoKg6VD.net] クッソささやかな体面保つためだけの自演も失敗とか本当にみじめないきものだな…
111 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 18:00:11.34 ID:/ZNLC/hj.net] これか。どういう意図のコピペなんだろうかね。 https://mevius.5ch.net/test/read.cgi/tech/1594615908/595
112 名前:はちみつ餃子 mailto:sage [2021/08/15(日) 18:12:10.32 ID:oR5NZ4bd.net] >>111 ブラウザが記憶してたのを再度投稿してしまったとかそういうしょうもないミスじゃないかな。 JaneStyle のメモ欄で以前のレス内容を貼り付けたりそのまま投稿できたりする機能があるよ。
113 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 18:15:56.65 ID:pJ9UilRh.net] だから勝手にコピペされたっつってんだろクソ餃子め >>104 は俺じゃないから 3行目を引用したかったのか変な自演したかったのかは知らん
114 名前:はちみつ餃子 mailto:sage [2021/08/15(日) 18:21:10.51 ID:oR5NZ4bd.net] >>113 すまぬ。 本人によるものでなくてもなんらかの意図でメモしてたものを うっかりということは起こりそうなデザインにはなっているので、 意図によるものでなくただのミスじゃねという部分が主旨。
115 名前:デフォルトの名無しさん mailto:sage [2021/08/15(日) 18:25:05.27 ID:pJ9UilRh.net] (´・ω・`)そうか
116 名前:デフォルトの名無しさん mailto:sage [2021/08/16(月) 15:03:34.95 ID:Gh+OcB3l.net] >>107 なんで突然はちみつ?
117 名前:はちみつ餃子 mailto:sage [2021/08/16(月) 15:17:56.99 ID:5E5Krdno.net] >>116 現時点でこのスレにコテ (+トリップ) 付きで書き込んでいるのがはちみつ餃子と QZ だけだからだろ。
118 名前:デフォルトの名無しさん mailto:sage [2021/08/16(月) 19:18:38.03 ID:QgSHgEhC.net] (unsigned) intの数を受けたら何らかの演算をして (unsigned) long longの数を返す、(unsigned) double の数を受けたら何らかの演算をして (unsigned) long double の数を返す、みたいのって逐一オーバーロードを書くしかないですよね? 要するに、大きいデータ型に格上げして何らかの演算をして返したいってことなんですが
119 名前:ハノン mailto:sage [2021/08/16(月) 19:34:40.64 .net] >>118 演算子のオーバーロードにしても関数のオーバーロードにしても、返り値の型を指定することは出来なかったかと 思いつくのは演算前の引数にあてがうキャストのオーバーロードですね
120 名前:デフォルトの名無しさん mailto:sage [2021/08/16(月) 19:55:44.02 ID:AiYiQHL1.net] 引数をテンプレートにして、引数Tのビット数と整数型かどうかを見て、一段階大きい型を戻り値の型とすることは出来る
121 名前:ハノン mailto:sage [2021/08/16(月) 20:16:27.49 .net] >>120 pls kwsk >>119 普通にコンストラクタのほうがいいですか‥
122 名前:デフォルトの名無しさん mailto:sage [2021/08/16(月) 21:59:33.60 ID:AiYiQHL1.net] ごめん、めんどい・・というか sizeof(T)と整数or浮動小数点数のbool(is_integralとかで取る)を受け取る構造体の中でtype(戻り値の型)を定義、とか考えてたけど 結局Tのサイズごとに特殊化するから手間変わらん、てのと 関数の中身が長くなるなら、オーバーロードした関数からテンプレート版(戻り値の型と引数の型がテンプレート)を呼んで、そこで中身書けば一回で済むね
123 名前:デフォルトの名無しさん mailto:sage [2021/08/16(月) 23:40:17.97 ID:cwTPPWgm.net] >>118 ふつうに long long や long double を引数で受け取るって演算して返す関数を書けば その通りの動作になりそうなんだけど、何か気に入らないの? 2つ関数書くのが嫌だってこと?(やりたいことが少なくとも2通りあるのに?)
124 名前:はちみつ餃子 mailto:sage [2021/08/17(火) 00:20:49.88 ID:yPn/BtRt.net] 大きい型というのは一段階大きい型という意味なのかな? 型の大きさは処理系 (アーキテクチャ) 依存だし、 ポータブルに書こうと思ったら思ったよりも面倒な感じ。 主要なアーキテクチャだけ対処できればいいなら 8 → 16 → 32 → 64 の拡張が出来ればいいので用意するパターンはそんなに多くはない。 ちなみに Windows の long double は double と同じ大きさだよ。
125 名前:デフォルトの名無しさん mailto:sage [2021/08/17(火) 02:08:49.72 ID:rNAqXouz.net] 何種類か関数があるならtraitsを作成するのもありじゃない?
126 名前:デフォルトの名無しさん mailto:sage [2021/08/18(水) 04:11:58.97 ID:ReVsRUuR.net] 関数読んだら1段階デカい型が返ってくるなんて使う側でも面倒が起きそうだな
127 名前:デフォルトの名無しさん mailto:sage [2021/08/18(水) 04:23:43.76 ID:TZ94eDdV.net] まぁ、戻り値にも使用できるテンプレートの追加の型を関数内でconstexpr的に定義出来たらいろいろ面白いことが出来そうではあるなw