[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 08/07 16:31 / Filesize : 257 KB / Number-of Response : 1034
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part150



1 名前:デフォルトの名無しさん mailto:sage [2020/03/24(火) 00:04:33 ID:YFRNwZnv.net]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

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


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

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

テンプレここまで

548 名前:デフォルトの名無しさん [2020/04/30(Thu) 12:50:20 ID:IVFUa3Rm.net]
ICUのイテレータ使えばよいのでは。

549 名前:◆QZaw55cn4c mailto:sage [2020/04/30(Thu) 20:12:10 ID:IOnQoYGj.net]
内部では utf-32 ベースで処理して、出口入り口で utf-8 に/から変換するものだと思いますが…

550 名前:デフォルトの名無しさん [2020/04/30(木) 20:49:36.61 ID:IVFUa3Rm.net]
そんな単純なものではないだろうけど。

551 名前:デフォルトの名無しさん [2020/04/30(Thu) 23:06:50 ID:b9TIw4B4.net]
期間工ブログの収入は1500万円でした。【フリーランスの現実&底辺からの復活編】
https://www.youtube.com/watch?v=aijLjFLOuC4
工場勤務、30代フリーターが「ブログ」で200万稼げた理由! ◯◯があったから?
https://www.youtube.com/watch?v=Cjmk4XusQVM
ブログで月200万稼ぐ、フリーランスの1日
https://www.youtube.com/watch?v=jaV2GyBgNX4
【クラウドソーシング】Webライティングで月商100万円まで稼ぐ方法をプロに解説してもらった!
https://www.youtube.com/watch?v=oYoaBwQt0Cg
1年半でライターの地位を確立した営業術!駆け出しフリーランスは要チェック【ニシキドアヤト】
https://www.youtube.com/watch?v=DFtmkhw-lHM

552 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 00:49:44.42 ID:2K4VYu4Y.net]
>>529
リッチーならともかくカーニハンは見てる可能性

553 名前:はちみつ餃子 mailto:sage [2020/05/01(金) 01:06:57.59 ID:Qu9UE9Tc.net]
>>536
色んな文字コード (符号化) を扱うときは出入口で変換する方法は妥当な選択だと思うけど、
UTF-32 を中心に据えるのが良いかは一概に言えるものでもないでしょ。

たとえば Windows API がいう Unicode は UTF-16 なわけだし、
外部とのデータのやりとりで内部用の符号に変換する処理が入るのは仕方がないにしても
API の呼び出しのときまで毎回変換が入るのも煩雑なんで、
UTF-16 に統一した方全体としては楽じゃない?

サロゲートペアの扱いが面倒くせぇとかいうのと天秤にかけたとしても
Windows では UTF-16 から離れられない。
結局のところ実行環境とかフレームワークとかの都合に縛られるから
(内部用の符号として UTF-32 が優秀なことは承知しているが)
そのへんの規約とか習慣に従うしかしゃーない。

554 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 01:37:06 ID:/3xCHgCD.net]
出入り口から内部処理まで出来る限りutf-8で統一して処理するのが
トラブルが少なくて済む(個人の感想です)

555 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 02:27:55.90 ID:uatxyJey.net]
それは文字列としてだけ扱って文字単位(code point単位)の操作しないときでしょ
あるいは小難しいところは全部ライブラリに投げてるとかね

556 名前: mailto:sage [2020/05/01(金) 07:33:59.06 ID:w4TGDP35.net]
>>540
>たとえば Windows API がいう Unicode は UTF-16 なわけだし、(略)
>API の呼び出しのときまで毎回変換が入るのも煩雑なんで、
>UTF-16 に統一した方全体としては楽じゃない?

Windows では UTF-16 を使うといっても、実際に変換しなければならないのは、ファイル名・パス名を扱うときだけですし、
UTF-16 も可変長の部分があって扱いにくいので、私なら UTF-32 で楽したいと考えますね



557 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 08:23:58 ID:DtDCGOpK.net]
実際にソフト開発したことが無いような書き込みだな

558 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 08:31:51 ID:NLgIsVNa.net]
UTF-32でも結合文字と異体字セレクタはある
結局ライブラリに投げるでしょ、ならどれでも同じじゃね?

559 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 08:47:44 ID:sYrLq0eo.net]
マルチプラットフォームのアプリじゃ内部はUTF-8にする場合が多いけどな
なぜならUTF-8にはバイト順問題がないから

どのみち一文字表すのに複数のコードポイントが必要なんだからUTF-8、16、32のどれを使っても言語処理の手間は同じだ
「イングランドの旗」絵文字なんてコードポイントで7要素も必要なんだぜ

560 名前:デフォルトの名無しさん [2020/05/01(金) 09:58:16 ID:k2YlXFh6.net]
マルチコアの高速化と同様に
32bitのCPUで16bitを扱うと2倍速
64bitのCPUで16bitを扱うと4倍速
みたいにならないんですか?

561 名前:デフォルトの名無しさん [2020/05/01(金) 10:00:07 ID:tdkjZBPc.net]
なりますよ。

562 名前:デフォルトの名無しさん [2020/05/01(金) 10:02:36 ID:tdkjZBPc.net]
32ビットと64ビットで二倍の時間になるのではなく、たいてい4倍になりますよ。

563 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 10:13:13 ID:Ia4c8IgS.net]
文字列関連の処理はだいたいメモリアクセスかIOがボトルネックなので、単純にサイズが 増えればその分遅くなるよ

564 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 10:19:22 ID:DtDCGOpK.net]
文字処理のほとんどは64bitがいかされない

565 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 10:22:39.64 ID:DtDCGOpK.net]
文字処理以外でもそれほど多くない

566 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 13:13:05 ID:uatxyJey.net]
>>547
simd使えばそれに近づくだろうけど
そうでなければシリアルに計算されるだけなのでほぼ変わらない
大量のデータを処理する場合はメモリ効率の点で速くなるかもしれない
しかしintへの拡大変換が入るので演算自体は遅くなる方向

まぁ自分でベンチとってアセンブラ眺めてみたらいい
かなり環境依存・実装依存なんだから人にきいてもあんまり意味ない
4倍になる人とかいるらしいしw



567 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 13:22:02 ID:DtDCGOpK.net]
SIMDなら32bit CPUとか64bit CPUとか関係ないし

568 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 14:33:57.85 ID:RpLrbaMs.net]
例えばRGBAの計算は早くなるよ

569 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 14:54:56 ID:8qmJgOle.net]
tclインタプリタに投げる
邪魔くさい

570 名前:デフォルトの名無しさん [2020/05/01(金) 15:22:00 ID:tdkjZBPc.net]
>>553
ベンチとるとおよそ4倍になりますよ。

571 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:04:33.87 ID:uatxyJey.net]
>>557
そのベンチどっかに貼ってみて
wandboxとか

572 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:07:40.19 ID:wrmDV0oq.net]
64bitを使っても、大部分のソフトウェアは速くも良くもならない事が知られている。
16bitから32bitの時には急激に多くのメモリが使えるようになって劇的にソフトウェア
が作り易くなったのと対照的。
メモリ容量に関してはたいていのアプリでは32bitでも既に十分。
速度に関してはそもそもCPUが扱えるデータビット数を多くしても滅多に速くならない。
速くなるのはグラフィックで単純なBitBLTを行うような場合のみ。
縮尺や回転が入るだけで64BITの効果は通常、生かせなくなる。

573 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:13:27.06 ID:DtDCGOpK.net]
>>555
変わった文字列処理だな

574 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:15:49.44 ID:wrmDV0oq.net]
>>555
RGBA計算も、(SIMDを使わずに)単純にデータバスが64BITになっただけでは速く出来ない。
なぜなら、R,G,B,Aはそれぞれ1バイトだから1バイトずつの計算するしかないため。
SIMDを使う場合は、CPUの種類によっては、SIMD自体のベクトルの要素数が倍になるため、高速化できる可能性はある。
ただしそれは、整数命令が64BIT化されたこととは直接関係ない。
SIMD命令のベクトルの「次元」が上がったかどうかの問題。

575 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:18:51 ID:DtDCGOpK.net]
>>561
なんでわざわざ関係ないことを書いてわざわざ混乱させようとするかなあ

576 名前:デフォルトの名無しさん [2020/05/01(金) 16:20:54 ID:tdkjZBPc.net]
64ビットの演算1回の時間で、32ビットの演算4回出来るんですよ。



577 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:22:03 ID:wrmDV0oq.net]
>>548
なりません。
ならないからこそ、GPGPUのようにマルチコア化が進められています。
SIMD命令も扱いにくいので、マルチコア化が適しています。
例えば、3Dのレイトレーシングなどは、SIMD化することはとても難しい
のですが、マルチコア化は比較的容易です。
人工知能のニューラルネットワークの計算はSIMD化し易い部分もあります。
しかし、300コアなどのマルチコアと、8要素のSIMD命令では、
前者に軍配が上がり易く、しかも、コア数が増えてもプログラムの修正が
ほぼ不要なので、マルチコアの方がSIMDより好まれます。
ただし、命令自体の速度がx86系は速いため、どちらが実際に速いかは
単純ではありませんが。

578 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:23:18 ID:wrmDV0oq.net]
>>563
CPUの一般論としてそんな事実は有りません。
あるなら具体的に書きましょう。

579 名前:デフォルトの名無しさん [2020/05/01(金) 16:25:25 ID:tdkjZBPc.net]
測ると大抵そうなってるというお話です。

580 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:33:18.55 ID:DtDCGOpK.net]
測定結果みせて

581 名前:デフォルトの名無しさん [2020/05/01(金) 16:33:57.33 ID:tdkjZBPc.net]
これ最初に気が付いたのは、固定小数点は速いらしいというのを見て、いろいろやってみたら、特に早いことは無くて。
じゃあ何が影響するかというと、単にビット幅だったんですよ。
floatとint32_tは同じ、doubleとint64_tは同じ。
つまり、アキュムレータの性能はあまり関係なくて、バス幅とキャッシュがすべてなんですよ。
じゃあ32ビット2回分が64ビット相当になるかというとそうでもなくて。
たいてい4回分で64ビット相当になるんですね。

582 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:37:43.83 ID:DtDCGOpK.net]
だから測定結果早くみせて

583 名前: mailto:sage [2020/05/01(金) 16:38:04.32 ID:w4TGDP35.net]
>>559
まさか!
2^32 bit 空間が狭すぎる、というのは windows XP の頃から問題になっており、2^64 bit 空間は必然でした

>メモリ容量に関してはたいていのアプリでは32bitでも既に十分。
個々のアプリ単体ではそうであっても、個々のアプリを複数稼動させる OS では32bit では足りないのでは?
そして 64bit OS に対応した 64bit アプリの存在も必要でしょう

584 名前:デフォルトの名無しさん [2020/05/01(金) 16:38:26.67 ID:tdkjZBPc.net]
自分で測ってもらえませんかね。

585 名前:デフォルトの名無しさん [2020/05/01(金) 16:41:04.33 ID:tdkjZBPc.net]
あと、僕はベンチマークのカタログとしてVSのテストエクスプローラ使ってますよ。
テストケースを一つずつ呼び出せるので大変便利です。

586 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:42:32.75 ID:8qmJgOle.net]
何をして速くなったと言っているのか不明なのに自分でってw



587 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:45:05.04 ID:uatxyJey.net]
>>571
測るのは自分でやるからベンチのソース見せてよ
比較実験やるにあたって環境も実装も変えたら比較にならないんだしさ
ここで逃げたらかなりださいと思うよ

588 名前:デフォルトの名無しさん [2020/05/01(金) 16:46:27.92 ID:tdkjZBPc.net]
>>574
そっちが出してくださいよ。
アセンブラ見ると速度がわかる奴。

589 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:51:31.85 ID:wrmDV0oq.net]
Qz は馬鹿だ。

590 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 16:54:18.57 ID:uatxyJey.net]
>>575
やっぱり無理か
そうだと思ってたよ

591 名前:デフォルトの名無しさん [2020/05/01(金) 16:57:02.32 ID:tdkjZBPc.net]
めんどくさいんですよ。
アセンブラ見れば速度がわかると言ってる時点で、僕は得るもの無いじゃないですか。
何か作業を手伝ってくれるならわかりやすく提示しても良いんですが。
作業を手伝ってもらうのに、色々教えないといけないなら、やっぱりめんどくさい。

592 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 17:00:18.65 ID:DtDCGOpK.net]
64bit命令を使うと4倍以上速くなるのは
64bitの乗算くらい

64bit加減算もCPUによっては数倍にはなる

それ以外は特殊な場合のみ

593 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 17:17:48 ID:9YfMO5iP.net]
intとint64_tで適当なfor分で配列計算やらせてみればわかる。
手元じゃint64_tのが若干遅い

594 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 18:21:10 ID:wrmDV0oq.net]
>>570
それは当たり前で、マシンには4GB以上のメモリが乗っているので、32BIT
では、OSレベルでは扱いにくい。
多くのプログラマにとって大事なのは、個々のアプリの問題だから、
OSレベルの話は関係ない。、
また、Windows OSがメモリーを食いすぎているという問題もある。

595 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 18:23:48 ID:wrmDV0oq.net]
>>581
補足すれば、グラフィック用のRAMは大きくなりがちで、最近のWindowsでは、
1つのWindowに仮想VRAMを割り当てているから、アプリが起動するたびに
グラフィック用になかなか大きなメモリーを消費する。
それと、ブラウザで複数のタブを開いている影響。
あれもグラフィックのレンダリング用に大量のメモリーを食っているのかもしれない。

596 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 18:31:06 ID:IyliQkiG.net]
>>578
他人を説得するつもりがないなら不特定多数が集まる場で自論を展開せず、馬鹿なこと言ってるなフフッて一人悦に入ってればいいんでない?



597 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 18:32:39 ID:IyliQkiG.net]
>>576
全面的に同意

598 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 18:40:33 ID:DtDCGOpK.net]
>>576
私も同意

599 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 19:15:32 ID:wrmDV0oq.net]
>>581
今は、見えないものまで含めれば50個のプロセスが動いているなんてことは当たり前になっている。
だから、個々のプロセスが80MBのメモリしか使って無くても、合計すれば4GBになる。
さらにファイルバッファや、OSが高速化のためにさまざまなキャッシュ的なデータを保持している。
しかも、ファイルバッファやキャッシュはいくらあっても不足する時代となった。
ブラウザがページを記録するためのキャッシュも必要だ。
そういう訳で、アプリが80MBしか使って無くても、OS全体では4GBではメモリが不足する。
というわけで、4GBを超えるメモリが必要となっている。
タスクマネージャーで見ていても、個々のアプリは、多くても数百MB程度のものが多い。
ファイル高速検索ツールなんかが、1.6GBも使っていたりするが、それは特殊。
だから「特殊なものを除いては」今のアプリが2GBを超えるメモリーを必要とすることは稀、だと言っている。

600 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 19:19:38 ID:DtDCGOpK.net]
それ
64bitで4倍
とどういう関係?

601 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 19:22:30 ID:DtDCGOpK.net]
32bit Windowsが4GBまでなのはWindowsの仕様であってCPU自体はそんな縛りは無いし

602 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 19:51:53 ID:wrmDV0oq.net]
>>588
典型的には、32BIT mode でも、PAE サポートによって OS は 4GB を超える
メモリーを扱えるね。

603 名前:デフォルトの名無しさん mailto:sage [2020/05/01(金) 20:58:17.99 ID:9yUywlA0.net]
64GBまで使えるようになったのPentium Proからだぜ?w
Klamathより前!!

604 名前:デフォルトの名無しさん mailto:sage [2020/05/02(土) 00:04:20.13 ID:jVHOaTi/.net]
>>548
釣り針でかいなw ここム板だぜw

605 名前:デフォルトの名無しさん mailto:sage [2020/05/02(土) 00:05:14.57 ID:jVHOaTi/.net]
>>588
おまえ嘘ばかりだなw

606 名前:デフォルトの名無しさん mailto:sage [2020/05/02(土) 01:38:26 ID:2lkgjmOV.net]
>>592
いや、彼は正しいことを言っている。
あなたがIntel CPUの仕様を詳しく知らないだけ。
PAEという仕組みなどで32BITモードでも4GBを超える物理メモリーを扱うことができるようになっていた。



607 名前:デフォルトの名無しさん [2020/05/02(土) 01:45:40.91 ID:ZXOrLboX.net]
PAEが何なのか全く分かってなさそう

608 名前:デフォルトの名無しさん mailto:sage [2020/05/02(土) 02:28:22 ID:2lkgjmOV.net]
QZは女なのだろうか。
ショックかも知れないがはっきり言えば、本質的に物事が正確に理解できていないようだ。

609 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 09:20:54 ID:slLa0KBW.net]
EMSなら前に聞いたことがある

610 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 09:24:35 ID:WVD/IFzz.net]
8bit CPUは256Bしか扱えないと思ってる人いる?

611 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 09:29:47 ID:6v/wuiGx.net]
16bitのCPUでも16bitアドレスの最大値である64KBを超えて1MBもアクセスできていたからな。

612 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 10:03:25 ID:WVD/IFzz.net]
>>595
女なら180度対応を変えます

613 名前:デフォルトの名無しさん mailto:sahe [2020/05/03(日) 10:22:47 ID:LxtsyLet.net]
>>598
16BIT CPU であった 8086は、16bit アドレスを超える範囲は、セグメントレジスタ
と合わせた seg:ofs の形式の far pointer を使わなくてはならならず、
単純に扱えるのは16BITまでで、16BITを超えた範囲では、seg レジスタの値を
足していかないといけなかった。しかも、segがアドレスの上位16BITだったなら
まだしも、16バイト単位のアドレスだったので、segレジスタに入れる値を計算
するのがとても重くなってしまっていた。
ところが、Z80 などの 8BIT CPUは、普通に 16BIT レジスタの
HL や DE, BC, IX, IY をもっており、8086 と比べれば扱いは容易だった。
その意味では、8086は、メモリーアクセスに関してはZ80と同じくらいしか
能力を持っていなかった。
それで8086の16BITモードでは限界が来て32BITモードのOSが待望された。
そしてMacのGUIを真似た機能を持っていたこととも合わせて32BITモードで
動いたWin95となった。

ただし、このような状況は64BIT化に関しては全く無い。

614 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 10:32:19 ID:6v/wuiGx.net]
そりゃまあ、64bitCPUがすでにいきわたっていてOS変えるだけで対応できたからね
WINAPIだって16→32のコンパイルはまず動かないけど32→64なら普通は動く
DOS時代のUMBみたいなみみっちい事態にならなくてよかったじゃん

615 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 10:35:22 ID:OJMdC3Cv.net]
86用コンパイラでnearとfarの他にhugeが有ると知らず、無限ループ作ってOSごと来なくなったあの頃

616 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 11:16:28 ID:WVD/IFzz.net]
結局64bit CPUだと速度4倍のコードは?



617 名前:フ名無しさん mailto:sage [2020/05/03(日) 13:08:16 ID:m/iHOjCC.net]
long longとint64_tの違いってlong longは環境によって64bitじゃなくなるけどint64_tは常に64ってことですか?

618 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 13:13:36.85 ID:LxtsyLet.net]
>>604
まあ、そういうこと。

619 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 14:04:07 ID:slLa0KBW.net]
           |
            |  彡⌒ミ
           \ (´・ω・`) またhugeの話してる・・・
             (|   |)::::
              (γ /:::::::
               し \:::
                  \

620 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 14:24:10 ID:m/iHOjCC.net]
>>605
ありがとうございます

621 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 15:56:11 ID:gvP0MmQx.net]
32bitの環境で32bitの境界を超えるような

622 名前:64bit値の計算ってどうやって実現してるの? []
[ここ壊れてます]

623 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 16:00:56 ID:uzK0zokK.net]
cpuに命令なければソフト的にやるに決まってんじゃん

624 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 16:06:34 ID:uzK0zokK.net]
ちなみに32bitの掛け算の答えに64bit必要ってわかってない人多いよね
同様に64bitなら128bit

625 名前:843 mailto:sage [2020/05/03(日) 16:22:11 ID:OGvyQUVV.net]
>>608
まずは筆算の足し算からやり直そうか

626 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 16:54:49 ID:+PpSUNNp.net]
64bitだとdoubleとかの書き込みはアトミックになるの



627 名前:デフォルトの名無しさん [2020/05/03(日) 17:17:29 ID:VkK7EFZv.net]
C/C++にキャリーフラグ観る機能が無いのはなせ?

628 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 17:56:41 ID:baOIQvWk.net]
アトミックにしたけりゃstd::atomicを使え
使わない場合は保証されない

629 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 18:16:14 ID:uzK0zokK.net]
>>613
いれるとしたらどんな仕様でいれる?
そこまで考えてから書いてみたんだよな?

630 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 18:19:51 ID:uzK0zokK.net]
>>614
64bitでない環境だとatomic持ち出したところで使えないじゃん

631 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 18:25:40.26 ID:baOIQvWk.net]
使えるぞ
内部でロックするから遅いけど

632 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 20:09:19.86 ID:7Ft0FuY4.net]
>>599
90度だろ?

633 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 20:16:01.21 ID:s7MuzCvB.net]
モダンc++入門ってどこみたらいい?

634 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 21:01:49.43 ID:0Fr9Yznx.net]
cpprefjp

635 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 22:43:31 ID:WVD/IFzz.net]
>>612
ほとんどの環境でYES
32bit CPUでもアトミックな環境もある

636 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 22:46:00 ID:WVD/IFzz.net]
>>613
キャリーフラグが無いCPUも有るから
CPU固有の機能はintrinsicを使う



637 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 22:52:17 ID:WVD/IFzz.net]
>>610
整数の乗算を全範囲正確に求めたい場合の話だな
これもC++では書けない
intrinsicを使う

638 名前:デフォルトの名無しさん mailto:sage [2020/05/03(日) 22:53:53 ID:WVD/IFzz.net]
>>618
なんで90度?
180度だって書いてるのに

639 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 03:33:26 ID:BnrivxPo.net]
int128でもint256でも自由に型が作れるのがC++の強みなのに書けないってw

640 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 06:12:26 ID:/zUHO7E0.net]
int_<256>みたいの作ってたけど
サイズが発散する問題がすぐ起きる

641 名前:843 mailto:sage [2020/05/04(月) 07:19:32.37 ID:oxprEh+7.net]
>>621
> 32bit CPUでもアトミックな環境もある
具体的な環境名教えて

642 名前:843 mailto:sage [2020/05/04(月) 07:20:47.92 ID:MJc5y26W.net]
>>624
(女は)話をはぐらかすって事だろ

643 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 07:22:03.70 ID:nMCshN11.net]
x86

644 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 08:03:18 ID:S2aUUuq2.net]
shared_ptr<Hoge>をvoid *の領域に格納したいのですがどうすればいいでしょうか?
SetPointer(void *),void* GetPointer()で設定します
shared_ptr<Hoge> hoge
として
SetPointer(hoge)

取り出す時
shared_ptr<Hoge> hoge = GetPointer()

645 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 08:04:47 ID:S2aUUuq2.net]
後、SetPointerする前にshared_ptrの参照カウントを一つ増やしたいです。

646 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 09:54:06 ID:Fiop0J3e.net]
>>630-631
所有権込みで格納したいだけなら。
SetPointer(new shared_ptr<Hoge>(hoge));
shared_ptr<Hoge> hoge = *static_cast<shared_ptr<Hoge>*>(GetPointer());
あとはどうにか delete が抜けないようにする。



647 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 10:27:13 ID:aMJtnkBw.net]
本当にshared_ptrごと格納する必要があるの?
これで良かったりはしない?

shared_ptr<Hoge> p(new(buffer) Hoge, [](Hoge* p){p->~Hoge();});

648 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 11:04:11 ID:BnrivxPo.net]
つまりshareする気がないけどshared_ptrを使いたいわけだな

649 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 11:24:26.33 ID:7IQ5DE83.net]
誰かと食べる気はないけど、マックのシェアポテトを食べたい感覚だね

650 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 12:42:16.41 ID:S2aUUuq2.net]
>>633
これ難しすぎて解読できません

まず、やりたいことはWindowsのTreeViewでノードを追加するときに、ノードにLPARAM型の任意のデータを関連づけれるんですが、そこに他の関数から受け取ったshared_ptr<Hoge>を関連付けたいのです

shared_ptrごと格納する必要ないと言えばないのかもしれません
でも中身だけ格納すると、deleter?の情報がとんじゃう?

651 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 12:55:51.13 ID:S2aUUuq2.net]
>>632
こっちの方で後で試してみます

652 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 13:16:44.39 ID:0skWT8b9.net]
なにがしたいのだかいまいちよくわからない

653 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 13:20:23.37 ID:/R09lZ8N.net]
所有したいのか/参照持ちたいだけなのか
shared_ptrとして使う必要があるのか
参照だけ持ちたいとしてダングリングの可能性が有るのか

654 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 13:46:24 ID:S2aUUuq2.net]
あーあ。shared_ptrごと格納できるならそっちの方がいいです。
そうしないと誰が最後にdeleteするかめんどくさくなりなすね。
すみませんでした

655 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 13:47:34 ID:aMJtnkBw.net]
TreeViewが持つのはポインタだけで、オブジェクトの寿命管理するわけじゃないんだろ?
だったらshared_ptrのdeleterの情報なんか渡す必要ないんじゃないか
オブジェクトの寿命管理する奴が知ってればそれでいい

656 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 13:56:33 ID:tzWRkvZC.net]
>>640
shared_ptrはlparamに収まらないから無理
sizeofで確かめてみ



657 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 14:01:15 ID:S2aUUuq2.net]
すみません。何か頭混乱してきた・・
>>631が余計だったのか・・

まず、基本方針としてオブジェクトの寿命管理を楽にするためにクラス間でデータをやり取りする場合は
全部shared_ptr経由で参照カウントにより自動で管理してもらおうという方針です。

ですが、既存のライブラリとの都合で例えば、今回のTreeViewのノードにはLPARAM型のデータしか関連づけらられない
ということで、ノードに関連づけるときに参照カウント手動で?増やしてあげて、ノードを削除するときに、
参照カウントを手動で減らして?あげて調整するものなのかなぁーと思った次第です。

658 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 14:02:14 ID:/R09lZ8N.net]
データの本体は別にあってそっちで所有権管理しているなら、treeviewにはshared_ptr::getで得られるpointer持たせればいい
使う側でshared_ptrである必要があるなら、shared_from_this使う

ダングリングする可能性無いならならこれでおk

659 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 14:12:18 ID:aMJtnkBw.net]
void*で渡しちゃう以上はTreeViewに参照カウント減らさせるのは不可能なので、そこは外側で管理してやるしかない
だったらTreeViewはshared_ptrがどうのこうのという情報は知らなくていいし、知らせるべきでない

660 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 14:19:40 ID:tzWRkvZC.net]
>>645
TreeViewってのはWindowsの既存のコンポーネントだろ
ちょっとまとはずれだよ
答えは >>632 で出てる

>>640
手動deleteが本当にいやならあとは黒魔術使うしかないね
unique_ptrなら64bitにおさまるだろう

661 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 14:23:16 ID:aMJtnkBw.net]
>>646
既存のコンポーネントだからだよ
shared_ptrのこと知らんやつにshared_ptr渡したってろくなことにならんだろ

662 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 14:33:47 ID:tzWRkvZC.net]
>>647
荒らしたくないがもうちょっと質問者の内容くみとってから返事書いてやれよ
shared_ptrの型で渡すんじゃなくてvoid*の型で渡すって最初から言ってんじゃん

663 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 14:47:05.48 ID:aMJtnkBw.net]
何が気に食わなくて噛み付いてるのかよくわかんないけど
TreeViewはshared_ptrのことなんか知らないんだから、そんなものは知らせずに
関連のあるデータを与える(要はshared_ptr<Hoge>*じゃなくてHoge*を渡す)方が設計すっきりするんじゃない?
って言ってるだけなんだがそんなにおかしいか?

664 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 14:51:53.81 ID:Zy37Y+hL.net]
何か追加して問題が出て別の何か追加して解決するの繰り返し
C++の仕様は余計なものが多い
メモリーの所有権の移動とかの暗黙知の極みを気にできるくらいならdelete忘れることはないだろうに

665 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 14:57:19 ID:Fiop0J3e.net]
Hoge* 渡して済むなら最初から相談なんて発生しないだろうと思ってたんだけど、
>643 みたいな「基本方針」だと shared_ptr の必要性が胡散臭いんで、確かに
Hoge* で済む可能性もありそうな気がしてきた。

666 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 15:00:15 ID:tzWRkvZC.net]
>>649
shared_ptrでわたってくるものをvoid*で管理したいってことで
それは質問の前提条件
解としてHoge* にするってのは破綻するからダメでしょ



667 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 15:10:46 ID:S2aUUuq2.net]
>Hoge* 渡して済むなら最初から相談なんて発生しないだろう
そうです。Hoge*で渡したくないから質問した次第です。

元のデータが先に捨てられようと、先にTreeViewのノードが破棄されようと、どっちが先でも
OKなように、それらを意識しないようになるべく参照カウントの仕組みで破棄したかったわけです。

668 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 15:22:06 ID:aMJtnkBw.net]
だったら>>632も、結局TreeViewの破棄を監視して破棄前にdelete GetPointer()かけないといけないんだけど
それでもいいのか?本当に意識すべきことは減ってるのか?無用な複雑さを持ち込んでるだけじゃないのか?
っていうことを一回冷静に考えた方がいいよ

669 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 15:23:27 ID:Zy37Y+hL.net]
逆にHoge*で受け取って、
Tree破棄時にPointer破棄処理省いてしまって、
あとはsharedのスコープで全消しすればいい
もちろんノード追加時に参照カウンタ増やす必要もない

670 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 15:24:48 ID:S2aUUuq2.net]
>>654
それは問題ないです。
>>643に
>参照カウントを手動で減らして?あげて調整する
って元からそれをやる前提でした

671 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 15:44:09 ID:S2aUUuq2.net]
前調べたら
https://docs.microsoft.com/en-us/windows/win32/controls/tvn-deleteitem
ノード削除時に発生するイベントがあるので、ここ1か所にかくだけでいいのかなと
思ったので、その方が分かりやすいかなと思った次第です

てか、この方法駄目そうですね?
>delete GetPointer()
じゃなくて、参照カウントを減らしたいんですけど、無理っぽいのかな・・
COMならAddRef,Releaseで調整できるんですけど

もうちょっと調べて駄目そうならHoge*でいきます

672 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 15:54:22 ID:Fiop0J3e.net]
>>657
new した shared_ptr を delete すれば参照カウント減るよ。
でも Hoge* で済むならそっちで済ませたほうが面倒も無くて効率もいいだろうよ。

673 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 16:04:26 ID:aMJtnkBw.net]
そもそもTreeViewってViewだから見た目を整えるための奴でしょ
自分ならロジックデータの寿命管理にそんな奴参加させたくないな

まあ、削除時のコールバックが指定できるんだったら、それで後始末するのも手ではあるかもね
小さいプログラムで、見た目の要素の何かとHogeが論理的に一対一対応してるんだったら許容範囲かな

674 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 16:11:26 ID:tzWRkvZC.net]
>>654
質問者はクラス間で共有するデータは一律shared_ptrにすると言っている
これは全体設計の選択としてまぁある話

しかしこれによって既存コンポーネントのTreeViewで
インタフェースのミスマッチが起こった、さてどうしたらいいでしょう?
という質問なわけ
これもよくある問題

だからって全体設計のポリシーをとりやめようとはならのよ
解決できる手段があるなら部分的な問題は個別に解決したらそれでいい

675 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 16:29:01 ID:aMJtnkBw.net]
>>660
言ってることは分かるけど
それでどうしてTreeViewにshared_ptrを埋め込むことに固執するのかがわからない
そこはおとなしくTreeViewには生ポで参照してもらうっていうのも一つの「部分的な問題の個別解決」じゃないの?

676 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 16:58:42 ID:b5BOjBYY.net]
Linux でのライブラリについて質問があります。
静的リンクライブラリ(拡張子が.aのファイル)は複数のオブジェクトファイル(拡張子が.oのファイル)を ar コマンドでアーカイブしたものと理解しています。
一方自分で調べた限り、動的リンクライブラリ(拡張子が.soのファイル)を作る場合には gcc を用いる場合は-shared (と-fPIC )を指定して一つのソースファイルから一つの.soファイルを作成しているように思います。
例: g++ -shared -fPIC -o sample.so sample.cpp

この理解の上で質問です。
動的リンクライブラリは静的リンクライブラリのように一つのファイルにまとめられないのでしょうか?ソースの数だけ.soファイルが出きてしまうのは避けられないのでしょうか?



677 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 17:07:30 ID:aMJtnkBw.net]
単に.oを複数与えればいいんじゃないの?
何か問題あったっけ

678 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 17:11:45 ID:mcNTUyFW.net]
>>657
汚い手段を避けるなら、
shared_ptr を受け取って保管し、管理用のハンドルを返すクラスを作って
TreeViewにそのハンドルを入れとけばいいのでは。

679 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 17:12:19 ID:heXhx7kW.net]
>>629
ちょっx86やx64でアトミックに読み書きできる(バスサイクルが他コアに割り込まれない)ことが保証されているのは
32 bitまででしかも32 bit境界に整列している場合のみのでは…
ちなdoubleは64 bit

680 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 17:30:50 ID:b5BOjBYY.net]
>>663
あっ、それでできるんですか。
ありがとうございます、やってみます!

681 名前:デフォルトの名無しさん [2020/05/04(月) 18:04:04.39 ID:IDpBo4iue]
あなたの会社は「お金を介した」依存?全員副業必須の経営がもたらした脱依存
https://www.businessinsider.jp/post-212190
コロナで働き方改革 東芝・ルネサスが週休3日制導入
https://www.nikkei.com/article/DGXMZO58776260U0A500C2TJC000/
新潟から週2回東京に出勤、サイボウズの複業採用社員に聞く複業ライフのリアル。
https://www.businessinsider.jp/post-166126
兼業でフリーライター、サイボウズ社員・明石悠佳に学ぶパラレルワーク術
https://www.wwdjapan.com/articles/752575
「複業を解禁しなければ人も企業も成長しない」複業全面OKのサイボウズ社長と実践社員の本音対談
https://www.businessinsider.jp/post-33893
育休は最長6年、副業もOK! サイボウズはなぜ「100人100通りの人事制度」を作ったのか
https://logmi.jp/business/articles/50252
年商10億円の“フリーランスの王”に聞く就活論「頭が悪い人ほど大手企業に行く」
https://headlines.yahoo.co.jp/article?a=20200401-00292145-bizspa-bus_all
副業3600万円のブロガー、マジメに確定申告したら税金がヤバいことに…
https://headlines.yahoo.co.jp/article?a=20200320-01649629-sspa-bus_all

682 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 18:05:00 ID:hwmiGMKy.net]
>>665
64bit境界であることは必須
あとは大昔のCPUじゃなければアトミック

683 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 18:43:33.39 ID:wRQD0Fqh.net]
wandbox上だとatomic<double>はロックフリーらしい、多分x86-64環境なら同じ
https://wandbox.org/permlink/0LWMsNPNmSn6rpZ4

684 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 18:54:28 ID:heXhx7kW.net]
>>668
>64bit境界であることは必須
ハア(゚Д゚)?
ていうことは
 char *p = 〜;
 *p = 'a';
は、pが8の倍数でなければ非アトミック??
 short *q = 〜;
 *q = 123;
もまた、qが8の倍数でなければ非アトミック???

なんと?!

685 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 18:56:20 ID:/R09lZ8N.net]
doubleの話をcharに拡大して何がしたいのか

686 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 18:57:04 ID:aRLx0l42.net]
アスペは文脈が読めない



687 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 19:00:17 ID:aMJtnkBw.net]
shortだって64bit境界跨いでたら非アトミックだぞ
わざわざ作らなければそんなことにならないだろうけど

688 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 19:06:17 ID:heXhx7kW.net]
つかインテルアーキテクチャーのソフトウェアーデベロッパーズマニュアルに

689 名前:よると
「8.1.1 Guaranteed Atomic Operations」
に書いてあったわサーセン;;;;
[]
[ここ壊れてます]

690 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 19:09:35 ID:heXhx7kW.net]
The Intel486 processor (and newer processors since) guarantees:
- Reading or writing a byte
- Reading or writing a word aligned on a 16-bit boundary
- Reading or writing a doubleword aligned on a 32-bit boundary

The Pentium processor (and newer processors since) guarantees:
- Reading or writing a quadword aligned on a 64-bit boundary
- 16-bit accesses to uncached memory locations that fit within a 32-bit data bus

The P6 family processors (and newer processors since) guarantee:
- Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line

とのことなので「The Pentium processor (and newer processors since) 」ならおk

691 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 19:15:43 ID:heXhx7kW.net]
で、「The P6 family processors (and newer processors since) 」において
キャッシュラインを跨ぐとatomicが保証されない旨がその下に書かれているので、
- Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line
は妄信はできん
やっぱalignedな場合しか信用できん

692 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 19:18:59 ID:/R09lZ8N.net]
まあ今時のプロセッサだとキャッシュライン単位でしかdramアクセスしないからそうなるのが自然なんだよね

693 名前:デフォルトの名無しさん mailto:sage [2020/05/04(月) 20:44:57.79 ID:Aib9AjJN.net]
こういう非常時でも特に誰かがプログラムで社会貢献してるとは聞かないな

694 名前:デフォルトの名無しさん mailto:sage [2020/05/05(火) 05:46:34 ID:EU5dGh0t.net]
アングル:コロナ感染経路、スマホ使った「接触追跡」の最前線
https://jp.reuters.com/article/health-coronavirus-tracing-idJPKCN21X0LE

つかビッグデータ取り扱い系分野は災害時に地味に活躍している印象
ホンダとか東日本大震災翌日からインターナビで収集した情報で被災地の道路寸断マップを
作って公開したんだったと思った(記憶モード
https://www.honda.co.jp/news/2011/4111109.html

695 名前:デフォルトの名無しさん mailto:sage [2020/05/05(火) 07:41:06 ID:NyxHUKM5.net]
ビッグデータを公開してくれれば誰か作るんじゃね

696 名前:デフォルトの名無しさん mailto:sage [2020/05/05(火) 07:46:04 ID:pSJxQCb1.net]
>>679
見た夢をそのまま書くスレ26
https://mao.5ch.net/test/read.cgi/occult/1584792697/



697 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 11:06:32 ID:lE4/XlkX.net]
>>612
その変の話は詳しくないので分からないのですが、この質問は、マルチコアやマルチCPUでの話ですか。
前から、その辺は、CriticalSection()などで排他処理すれば問題ないのではないかと思っていたのですが、その変どうなんでしょう?
それとも、自作OSなどで、 CriticalSection()のようなものを自作する場合の話でしょうか?
ちなみに、xor xchg などの話はよく理解できてません。
これらは、複数のCPUが1つのフラグを同時に読み書きした場合の問題なんでしょうか。

698 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 11:15:03 ID:lE4/XlkX.net]
>>682
マルチCPUなどの場合は、キャッシュの同期(?)も関係してくるので、
そもそも何を持って「atomic」かどうかということが疑問になってきます。
キャッシュの内側で、CPUが、atomicにキャッシュに書きこんだつもりで
あっても、他の CPU のキャッシュに反映されない可能性があるので意味が
ないように思えます。
となれば、キャッシュ制御まで含めて考えないといけません。
キャッシュも、1次キャッシュ、2次キャッシュ、データ用キャッシュ、
コード用キャッシュ、パイプライン、などものすごく複雑になっているので、
果たしてそういうようなものを含めて「atomic」という言葉ですべてを語ることが
出来るのかどうかも疑問です。

699 名前:デフォルトの名無しさん [2020/05/06(水) 11:18:02 ID:q6Rk1GB6.net]
自演かと思ったらレス繋いでるだけか
紛らわしい

700 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/05/06(水) 11:26:57 ID:exILxtx0.net]
>>682-683
https://cpprefjp.github.io/reference/atomic/memory_order.html

701 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 12:03:09 ID:+O5RjP+P.net]
>>612の意味は
読み書きの途中で他のCPUやコア、スレッドが別の処理を行う事で一貫性が無くなる事は無いということ

例えばatomicでないと
64bitの一部を書き込んだところで
他のスレッドが値を読んでしまって
64bit全体としてあり得ない値になる
というような事が起こらない
というだけ

同期とか他の読み書きとの順番とか
そういう事はatomicは何も保証しない

702 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/05/06(水) 12:24:44 ID:exILxtx0.net]
データベースとかで言う Atomicity と同じやね。

703 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 14:18:32 ID:lE4/XlkX.net]
>>686
あるスレッド書いたdouble値を別のスレッドが読みたい場合
CriticalSection 中に読み書きすればよいのではないですか?

704 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 14:20:11 ID:lE4/XlkX.net]
OSカーネルの実装以外では、命令自体の atomic 性に期待するのではなくて、
ちゃんと、OS が用意している API や system call を使って、CriticalSection
的なブロックを作って、その中で読み書きするのが基本ではないですかね。

705 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 14:25:21 ID:E/8R3YZo.net]
>>688
それで十分ならそれでいいよ
無理して難しいことしなくていい

706 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 14:39:37 ID:lE4/XlkX.net]
MotherBoard上にもキャッシュがありますし、マルチコアではなく、マルチCPUの
環境だと、いくらCPUがatomicに書いているつもりでも、バスでつながっている
他のCPUのキャッシュには反映されていない可能性もあるのではないでしょうか。



707 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 14:47:57 ID:E/8R3YZo.net]
>>691
だから難しいこと気にしなくていいって
だまってCriticalSection使ってろ

708 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 14:50:55 ID:E/8R3YZo.net]
お前のバカなところはてめぇの無知を自覚せずに
atomicは不要というぶったぎり論を始めたところだ
もしいい年したおっさんなら芽がない

709 名前:◆QZaw55cn4c mailto:sage [2020/05/06(水) 14:52:33 ID:yhwBg0Yu.net]
>>691
>MotherBoard上にもキャッシュがありますし
それは Pentium 世代でしょうね、PenII 世代からはマザーにキャッシュを乗せるというのはきいたことがありません

710 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 15:28:47 ID:dxwAL6rC.net]
>>693
そんなに物知りなら、こんなところで聞かずにIntelマニュアルでも調べたら分かることじゃないか。

711 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 15:32:15 ID:dxwAL6rC.net]
はっきり言って、ここで double 値への書き込み atomic だなんて言ってる人の言うことはどこまで信用できるか分からん。
x86 CPU的には、xchg命令など一部の命令を除いてはそんなことは保障されてるかどうか定かではない。

712 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 15:40:04 ID:g1nQsgpd.net]
>>695
お前こそマニュアル読めよ
メモリ操作にはlockプリフィクスがつけられるんだよ

713 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 16:04:50 ID:dxwAL6rC.net]
lock prefix は、mov 命令には付けられないがな。

714 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 16:15:13 ID:zSUZ9nVL.net]
データ競合と競合状態ごっちゃにしてない?

715 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 16:36:19 ID:DK2U3wBE.net]
アトミックはいわゆるout of thin airな値の発生を防ぐためのもの
それ以上でもそれ以下でもない

716 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 16:50:28 ID:8YawtAIF.net]
std::atomic の意味付けとごっちゃになるから、「割り込み不可」「不可分」あたりと使い分けてほしいなぁ。



717 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 17:03:54 ID:dxwAL6rC.net]
もしかして、
double  g_dbl[1024];
に対して、何かの値を足すような動作を、2つ以上のスレッドで
分担して行うことで高速化しようとしているのか?
そんなやり方は、マルチスレッドプログラミングでやっていいのだろうか。
普通は、要素番号 0〜511 までをスレッド1が、512〜1023 までをスレッド2
が計算して高速化する。
全く同じ場所に複数のスレッドが書きこむことは原則としてやらないはずだ。

718 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 17:08:11 ID:dxwAL6rC.net]
>>7

719 名前:03
GPGPUを使ったレイトレーシングでも、画面上の別のピクセルをそれぞれのコアが
計算するのが原則で、1つのピクセルを複数のコアが分担して計算するには、それなりの
工夫がいる。
工夫というのは、途中までは別のワーキングエリアに書きこんでおいて、最後に
その結果を基本的にシングルコアで足し合わせて最終結果とするようなことだ。
これだと、例えば、途中の計算を double型で行うとしても、doubleへの書き込みが
atomicであることは特に必要ない。
[]
[ここ壊れてます]

720 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 17:11:26 ID:E/8R3YZo.net]
>>698
そうだけどmovはそもそもatomicじゃん
>>696 で何をいいたいのかわからないな
(ちなみに最近のコンパイラはfpu命令でなくsimd使うのでmovと書いてる)

721 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 17:14:17.87 ID:dxwAL6rC.net]
気になったのは、「atomic」というコンピュータサイエンスで用いられている
言葉を >>612 のように実際のCPUで出来ているかどうか質問していること。
IntelのCPUマニュアルでは、atomicという言葉は使わずに、#LOCK PINアサート
が立つかどうかや、キャッシュコヒーレンシー、といった言葉で説明されている。
「atomic」という言葉は、キャッシュなどが「無いものとして分かり易く」
理解するには有効であるが、実際のCPUではキャッシュの一貫性や、PCIバス規格
と絡んだ詳細な説明が必要となる。
何を持って「atomic」というか、という問題が起きるからだ。

722 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 17:18:53.44 ID:dxwAL6rC.net]
>>704
movも、実際のCPUでは必ずしもatomicとは限らない。
まず、alignment 境界を跨いででいるような場合や、
物理的に複数のCPUがマザーボード上にある場合のキャッシュの一貫性の問題が
あるから。
Intelの最適化マニュアルなどで、マルチコア並列化の例として上がってないような
方法は、勝手にやると破綻するかもしれない。
実機で実験してやるのは自由だが、他の人のCPUでは誤動作するのは覚悟した方がいい。
「アメリカ人は、書いてないものを勝手に使ったあなたが悪い」
という思想だぞ。

723 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 17:31:25.73 ID:E/8R3YZo.net]
>>706
マニュアルに安全な具体例として載ってないから疑ってるって話ね
ご自由にどうぞ
でもそれはあくまでお前の判断
メジャーコンパイラがintelのサポートうけてないとは思えないから
おれはコンパイラの出力眺めてみるけどね

724 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 17:39:01.96 ID:dxwAL6rC.net]
>>707
並列化の処理は研究されているから、Intelが例として一度も書いてないんだったら
多分やめた方がいいと思う。

725 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 17:49:26.97 ID:+O5RjP+P.net]
>>705
atomicとコヒーレンシーや同期がごちゃまぜになってる

もうちょっと勉強するか
素人なら素直に既にある同期や排他制御の仕組みを使いなさい

726 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 17:51:54 ID:+O5RjP+P.net]
色々な理由でやむを得ず使う上級者の技を
素人がまねしなくて良い



727 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 17:57:11 ID:E/8R3YZo.net]
>>708
ちなみにメジャーコンパイラが
std::atomic<double> & std::memory_order::relaxed
をどう展開するか知ってるんだよね?
これを疑ったらコンパイラを自作するしかないんでは?

728 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 18:31:40.49 ID:dxwAL6rC.net]
>>711
そのoperator=()関数は、store() 関数を使っていて、その関数は lock(), unlock()
で囲ってから書き込みをしている。

729 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 18:56:13.77 ID:E/8R3YZo.net]
>>712
そりゃご愁傷様
おれの環境だと普通にmovqだけどね

730 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 18:57:46.10 ID:dxwAL6rC.net]
>>713
だったらそれでいいじゃない。

731 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:17:44 ID:E/8R3YZo.net]
>>714
おれは最初から困ってないしw
お前がいろいろ大丈夫かよ

732 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:18:48 ID:dlDgLyfe.net]
ちょっ(キャッシュの)一貫性とアトミック(なアクセス)は別概念なのでは…
後者はあくまで>>665の括弧内の意味
一貫性が保証されている

733 名前:P一キャッシュライン内のデータに対するアクセスでも
アトミックでないケースが理論上はありえる
[]
[ここ壊れてます]

734 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:19:22 ID:ZjhSP/3u.net]
なんで揉めてんだか訳わかんね

735 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:21:46 ID:dlDgLyfe.net]
つか同一キャッシュラインに乗っているからといって
配列アクセスは非アトミック、

736 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:23:51 ID:dlDgLyfe.net]
>>681
じゃあ電話交換機のプログラマーとか?

災害に際して実際に活躍したシステムの例を引き合いに出したのに
なんで白昼夢スレに誘導されるのかがわからん…



737 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:44:30.16 ID:6g3bWVkt.net]
C++でdoubleで同期取ろうとしてることすら意味不明なんだがキミたちは結局何がしたいんだい? 
処理系依存するものはOSの同期を使えよ。

738 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:47:35.61 ID:S060FgXU.net]
>>705
atomicっていう言葉は使われてるが
https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-258.html

739 名前:デフォルトの名無しさん mailto:age [2020/05/06(水) 19:48:49.83 ID:kak2WxQU.net]
同期がめっちゃ遅いから困ってんだってよ

740 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:55:48.41 ID:6g3bWVkt.net]
同期は遅くて当たり前だろ。
並列化したら速くなるとか同期コスト知らないIT音痴の妄想なんだから。

処理系依存していいならIntelのTSX試せよ。

741 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 19:58:00.21 ID:DK2U3wBE.net]
同期を速くするのは無理だぞ
高速化したければ同期を減らすんだぞ

742 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 20:12:52.44 ID:E/8R3YZo.net]
>>720
できるかどうかと
やるべきかどうか
は別の話
区別しようぜ

743 名前:843 mailto:sage [2020/05/06(水) 21:51:51 ID:U6CLxvSb.net]
Atomicの話と同期の話の区別も宜しくねw

744 名前:デフォルトの名無しさん mailto:sage [2020/05/06(水) 22:20:21 ID:+O5RjP+P.net]
>>720
誰もdoubleで同期を取るなんて話はしてない
atomicなアクセスの話題

>>718
複数ならSIMDレジスタを使う
YMMなら4個、ZMMなら8個までatomic

745 名前:デフォルトの名無しさん mailto:sage [2020/05/07(木) 00:01:22.08 ID:hoUWiCnf.net]
同期をとればatomicである必要はない
そういうことじゃないのか

746 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 00:24:54 ID:N8w6+mz8.net]
話をまとめるとこうなる。

・8byteの読み書き命令がatomicかどうかは処理系依存する話でC++の話ではない。スレチだが聞くならチップを指定して聞け。チップ仕様見れば答えは出る。議論の余地はない。
・8byteの読み書きを同期したい、atomicにしたい。OSの同期か適当な同期ライブラリ使え。悩む余地なし。
・atomicと同期は話は別だ →ありえないw ハードでatomic命令の実装に同期が必要だし、ソフトの同期処理の実装にCPUのatomic命令を使う。atomicの実装を知りたければVHDLスレにでも行け。
・馬鹿は同期を理解できない←30年前から言われてる名言。C++スレでdoubleがatomicかというアホ質問自体が証左。



747 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 01:03:56 ID:M+iqUPlL.net]
EOF

748 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 01:11:02 ID:0pZrsm5h.net]
>>721
なんだ、そこにそのまま書いてあるじゃない。
つまり、alignされているなら quadword は atomically に Read/Write できる。
キャッシュラインの中に納まっているなら align されてなくても OK、と。
8.1.1 Guaranteed Atomic Operations
The Intel486 processor (and newer processors since) guarantees that
the following basic memory operations will
always be carried out atomically:
・Reading or writing a byte
・Reading or writing a word aligned on a 16-bit boundary
・Reading or writing a doubleword aligned on a 32-bit boundary

The Pentium processor (and newer processors since) guarantees that
the following additional memory operations will always be carried out
atomically:

・Reading or writing a quadword aligned on a 64-bit boundary 16-bit accesses to uncached memory locations that fit within a 32-bit data bus

The P6 family processors (and newer processors since) guarantee that the following additional memory operation will always be carried out atomically:
・Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line.

749 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 06:07:03 ID:cLsDnrKi.net]
>>612に対する回答は既に>>675で明確に示されて終わってる話。
それを急に同期の話と勘違いしてとんちんかんな蒸し返し方をした>>682が

750 名前:ィかしい []
[ここ壊れてます]

751 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 06:35:21 ID:N8w6+mz8.net]
その486の話でいうと、当時、486は自己書き換えコードを駆逐した。Prefetchされたコードは非同期のまま実行されたからだ。Prefetchされたものはメモリではないと言い訳してもPGはそうは思ってないのだから高速なCPUだけ動かないコードがいっぱいあったわけだ。
結局、Intelが折れたのかPenから正しく同期されるようになった。TSXといいIntelも結構やらかしてるし、PICじゃ今でも同期エラッタてんこ盛り。MIPSの実装なんて言わずもがな。

752 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 06:52:28 ID:Xvq6sZ7Q.net]
同期って用語の使い方に違和感があるなあ

753 名前:843 mailto:sage [2020/05/07(木) 07:35:15.71 ID:/g81R4QF.net]
>>734
同意
そもそも486の時代に自己書き換えコードがいっぱいあったとかにわかに信じがたい

754 名前:デフォルトの名無しさん mailto:sage [2020/05/07(木) 08:02:12.59 ID:wkYaXeHy.net]
8086時代は結構あった
古いコードのおもりをさせられた人は苦痛だったろうね
今よりはるかにパズルコードが多かったし

755 名前:デフォルトの名無しさん mailto:sage [2020/05/07(木) 08:27:36.65 ID:N8w6+mz8.net]
>>732
atomic命令=排他制御(同期処理)された命令。同義。
doubleアクセスがatomicか知りたい=double値で同期したいと解釈するのは普通じゃないかな。
まぁatomicであろうとなかろうと、C/C++的にはOSの同期オブジェクト使えって結論になるわな。
マルチスレッドの再現性ないバグの99%は同期のおれおれ実装が原因だし。

756 名前:843 mailto:sage [2020/05/07(木) 09:26:23.94 ID:rgMcdocw.net]
アトミックと排他制御と同期処理って同じじゃねーぞ
doubleでアトミックと言うのは例えば
double d = 1.23;

d = 2.34;
ってやった時にdが1.23と2.34以外の値にならない事を言う
どっちの値になるかまでを保証するわけじゃない



757 名前:デフォルトの名無しさん mailto:sage [2020/05/07(木) 09:34:04.25 ID:qJNaSSxu.net]
何に基づいた主張なのかわからない
論拠も書くべき

758 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 09:50:51 ID:N8w6+mz8.net]
>>738
おれは同じ意味で使ってるし、
世界の技術者もそうだからボクたちに合わせてくれないかな。

759 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 09:53:56 ID:Uptrp4d8.net]
>>737
> まぁatomicであろうとなかろうと、C/C++的にはOSの同期オブジェクト使えって結論になるわな。

お前 ID:lE4/XlkX だよね?

760 名前:843 mailto:sage [2020/05/07(Thu) 10:01:49 ID:EiluKhsY.net]
>>740
> おれは同じ意味で使ってるし、
それは勝手にしてくれ、どうせ人の言うことを聞かないだろうし
> 世界の技術者もそうだから
妄想乙w

761 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 10:21:20 ID:N8w6+mz8.net]
>>741
単発IDのくせにいなきり「お前」かよ。GWはほんと口の聞き方も知らないリアルクズ野郎ばかりだな。
おまえのような礼儀も知らず妄想しかできない低能クズに寛容なるおれ様が特別に教えてやろう。

違いますよ^^ 礼儀を知らない馬鹿は二度とおれにレスすんなw

762 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 10:32:16 ID:PvsEcGe8.net]
同期とアトミックと排他制御が同じとは
ヤバいのがいるなこのスレ

ソフトウェアの基礎を学んだ方が良い

763 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 10:36:17 ID:0pZrsm5h.net]
個人的に並列化処理といえば、例えば2coreの場合、
double buf[1024];
の内の、0-511 までを core1、512-1023 までを core2で処理するものだと思っていた。
atomicであるかどうかを気にしている人は、
buf[0] を core1とcore2で
[core1]
for(・・・) {
 buf[0] += 1.0;
}
[core2]
for(・・・) {
 buf[0] += 1.0;
}
みたいに同時に書きこみたいと思っているの????
でも、atomicというのは、書き込みのみ、または、読み込みのみ、のどちらかの
場合だと適用できるけど、↑のコードの場合、+= 演算子は、直前の値を読み取ってから、
1.0 を足して、同じ場所に書きこむ動作をするので、いくら、double値の書き込みが
atomicであっても、結果はめちゃくちゃになるよ。

764 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 10:45:35 ID:Uptrp4d8.net]
>>743
- std::atomicの使い

765 名前:どころを理解してない
- "OS"の同期プリミティブを使えと主張 (なぜOSと限定?)

この二つの条件を満たす別人が現れる確率は結構低いと思ったんでね
非礼の詫びとしてatomicの使いどころ知りたかったら教えてやるけどどう?
[]
[ここ壊れてます]

766 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 10:50:13 ID:Uptrp4d8.net]
>>745
そんなraceばりばりの例だめにきまってんじゃん
単純に一方がwriter、他方がreaderでもatomic性は必要でしょ



767 名前:843 mailto:sage [2020/05/07(Thu) 11:13:09 ID:lQhGrp4h.net]
>>745
> atomicであっても、結果はめちゃくちゃになるよ。
+= の話はレイヤーが違う
2 threadで元々0.0の変数に各々 += 1.0を10回実行した時に結果が20.0増えないことがあるって言う話をしてるんだろうけど結果は1.0~20.0に範囲になる
>>612のは浮動小数点フォーマットとして正しいかどうかもわからん

768 名前:デフォルトの名無しさん mailto:sage [2020/05/07(木) 11:20:48.41 ID:Xvq6sZ7Q.net]
std::atomic<double>はoperator+=ないね

769 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 12:09:28 ID:0pZrsm5h.net]
>>748
>>612のは浮動小数点フォーマットとして正しいかどうかもわからん
それも、個人的には分かっているつもり。

770 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 12:11:04 ID:0pZrsm5h.net]
>>747
>単純に一方がwriter、他方がreaderでもatomic性は必要でしょ
確かに必要だね。
でも、個人的には具体的にどういう利用例があるのか分からない。

771 名前:843 mailto:sage [2020/05/07(Thu) 12:17:56 ID:FtlEpNqJ.net]
>>750-751
書き込みスレッドが書き込んでいるデータを読み出しスレッドが読み出して表示する
とかの場合アトミックでないと不正なデータを表示してしまう
計測器等でありがちな処理だよ

772 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 12:53:58 ID:N+2vUAWE.net]
>>751
一番原始的なスレッド通信

>>745
複数命令を使って事実上アトミックに出来るCPUもあるし
整数ならアトミック加算出来る命令があるCPUもある

ARMやMIPSは前者、x86は後者

773 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 17:00:45 ID:jqbAFx8V.net]
C++に限ったことじゃないかもしれないんですけど質問させてください
typedefで型に別名つけることについてです。今いじってるコードでたとえばvector<animal>にanimalsって型名をつけるようなのが山のようにあるんです
これすごくわかりにくいなと思います。例えばvector<animals>で宣言されてればその変数にどんな操作ができるのか一発ですが突然animalsで宣言されても何ができる型なのか初見では分かりません
別名をつけることがメリットになることってあるんでしょうか

774 名前:デフォルトの名無しさん [2020/05/07(Thu) 17:14:48 ID:8jv+kISL.net]
メリットは君が言ってる通り特定の言語に限った話では特定の回答は出て来ないし
言語を取り巻く環境(エディタや統合環境や諸々)でも答えは変わってくる

775 名前:◆QZaw55cn4c mailto:sage [2020/05/07(Thu) 18:04:16 ID:VS6AE9q5.net]
>>754
using animals = std::vector<animal>;
わたしも、こういう typedef はしない方ですね、リッチなエディターを使っていないせいかもしれません
書いた人は別名を細かく付けた方がいいと考えているようですが、こういうのは記述の粒度の問題かもしれませんね

776 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 18:08:47 ID:cLsDnrKi.net]
>>754
例えば後からvectorじゃなくてlistにしたいなーと思ったときに修正箇所が一箇所で済む



777 名前:デフォルトの名無しさん [2020/05/07(Thu) 18:14:03 ID:V086WOzl.net]
テンプレートで使うからでは。

778 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 18:29:01 ID:0pZrsm5h.net]
>>754
書くのが簡単になり、見るのも分かり易くなることがある。
また、animal_s とちゃんと最後に複数形を現す「_s」を付けるという
自分なりの命名規則を付けておけば、vector<animal> のことである
こともすぐに分かる。

779 名前:デフォルトの名無しさん [2020/05/07(Thu) 18:31:07 ID:0pZrsm5h.net]
>>759
なお、型名は小文字ではなく、Animal か、CAnimal、TAnimal のようにするのが慣例。
vector<Animal> の場合、AnimalVector とすると、書くのも理解するのも楽になる。
templateのままをコード中に大量に書くとわずかな書き

780 名前:ヤ違いで変な動作になりかねない。 []
[ここ壊れてます]

781 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 18:36:04 ID:0pZrsm5h.net]
>>760
templateは、C++の中でも最も複雑で、書き間違えたときのエラーが理解しにくい
とされる部分。
だから、vector<Animal>とコードのそこかしこに書きまくるのはお勧めしない。
それと、<や> は、キーボードの配置からして打ち込みにくいという事情もある。
指が届きにくい場所にあるというか。
また、vector<Animal
と> を書き損じたような場合、>を探してコンパイラが変な場所でエラーを出して
しまい、どこでエラーが始まったか探し出すのに苦労するようなこともある。
だから、このような「組み立てられた型」は、毎度毎度そのまま使うと痛い目に
遭う可能性があるので、animals と typedef した人は賢い。

782 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 18:37:12 ID:N8w6+mz8.net]
>>746
レスするなと言ってるのにほんと人の話を聞いてないな。だから別人だって言ってるだろう。
std::atomicの使いどころってstd::atomicの話題に一度もレスしてないし、std::atomicの話を振られてもいない。

しかもOS限定とか妄想そのもの。
> OSの同期か適当な同期ライブラリ使え。悩む余地なし。
と最初に言ってる。逆にキミのその発言で、キミは今まで禄にコードを書いたことのない糞ガキの学生ということがよくわかったよ。

仮にOS提供の同期機構かstd::atomicかという選択であっても1nmもstd::atomicの選択余地はない。0%だ。
枯れてないライブラリは論外。同期バグはOr****やIntelでもやらかすし、枯れてるほうを使う。
何十年もカーネル開発者が注力し、コキ使われてきた実績のある同期コードを選ぶのがまともな社会人。
キミのような無責任な子供やテストしないOSSな人じゃないからね。OS提供がなくても同じ。
組み込み系ならチップメーカーが提供する同期ライブラリを使う。

783 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 18:39:12 ID:0pZrsm5h.net]
命名規則は、animals よりも、
vector<animal> の時には、AnimalVector
list<animal>の時は、AnimalList
とするのがお勧め。
最後の s だけだと、見落とす可能性があることと、集合体であることだけは
分かっても、それが、どんな種類の集合体かまでは分からないため。

784 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 18:42:48 ID:0pZrsm5h.net]
もうひとつ、vector<animal> より、AnimalVector とした方がいい理由は、
正規表現検索する場合のため。
正規表現だと、< や > は何らかの meta 表現的な意味を持っている場合があるかも
知れないので、型名は単純な alphabet 列の方が何かと便利。

785 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 19:54:24 ID:RMklkh4T.net]
今どきシステムハンガリアンもどきなんてやだよぅ

786 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 20:03:35 ID:wkYaXeHy.net]
vectorからlistに変えられなくなる



787 名前:◆QZaw55cn4c mailto:sage [2020/05/07(Thu) 20:14:04 ID:k+gNGLxR.net]
>>763
vector から list に変えるときに、名前もいちいち変えないといけないのだったら、その命名ルールは今いちですね…

788 名前:デフォルトの名無しさん [2020/05/07(Thu) 20:56:23 ID:V9Hy6a5I.net]
Animalsの話題はわたくしがC++最大の謎と呼ぶvector継承不可問題だ
Javaだと「class Animal extends ArrayList<Animal>{」とできる
でもC++だとvectorそのものの継承はデストラクタの関係で認められていない

つまりクラスを作るかtypedefするか、C++には2通りの解決方法が存在する

789 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 21:04:23 ID:+JcfXk10.net]
自分作りゃいいだろ
コンテナくらい

790 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 21:04:44 ID:Gk4UMZDB.net]
別にvector継承してもいいんだよ
protectedかprivate継承する分には何の問題もない
役には立たないけど

791 名前:デフォルトの名無しさん [2020/05/07(Thu) 21:07:22 ID:qT/QDoOR.net]
この程度でs付け忘れるとか不注意にもほどがある

792 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 21:10:02 ID:QyPqnZke.net]
いや、vectorは今となっては継承すべきでないってこともないだろ

793 名前:デフォルトの名無しさん mailto:sage [2020/05/07(Thu) 21:21:54 ID:hoUWiCnf.net]
vector<>のデストラクタが仮想でないのは仕様の欠陥ですか?

794 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/05/07(Thu) 21:30:23 ID:8B1BhNza.net]
注意深さに自信があるならデストラクタが virtual でないクラスを public 継承しても
それ自体は言語仕様には反しないけど、人間は間違うのでな……。

>>770
private 継承した上で外部から呼び出しを許すメンバ関数は using すればいい。
役に立たないということはないと思う。

795 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 01:16:40 ID:Fn7VYFHg.net]
基本的なことだと思うけどよく
よくあるイベントループってどうやったらシンプルかつMT安全かつ効率的に実装できる?
次のような条件で
- qeueuが空ならwaitする
- qeueuにイベントが追加されたら直ちにおきてdispatchする
- dispatchに長い時間かかることもありえる
- add_eventは可能な限り短い処理で完了する。
- stopがよばれたらloopから直ちにぬける。dispatch中の場合は終わってから抜ける。

次に雰囲気コード書きます。

796 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 01:21:33.28 ID:Fn7VYFHg.net]
loop()がこれではいかんのはわかってるけど、どうすれば簡潔に書けるのかわからん
他にもあやしいところがある気がする

bool running = true;
std::deque<int> unsafe_queue;
std::mutex mtx;
std::condition_variable cond;
using unique_lock = std::unique_lock<std::mutex>;
void stop() { running = false; }
void add_event(int i)
{
  unique_lock _(mtx);
  unsafe_queue.push_back(i);
  cond.notify_one();
}
void dispatch(int) { /*do something*/ }
void loop()
{
  unique_lock lock(mtx);
  while (running) {
    cond.wait(lock, [] { return !unsafe_queue.empty(); });
    auto ev = unsafe_queue.front();
    unsafe_queue.pop_front();
    dispatch(ev);
  }
}



797 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 03:21:51 ID:7git1+gm.net]
まずconcurrent_queueを持ってくるなり作るなりして用意した方がいいよ
イベントループにロックやイベント混ぜて書くとわけわからなくなる

798 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 03:34:19 ID:7git1+gm.net]
イベントって同期イベントね

799 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 03:38:35 ID:FOXu+lyu.net]
concurrent_queueは必要ないと言うかこの用途だと無駄な処理増えるだけじゃね

800 名前:843 mailto:sage [2020/05/08(金) 05:40:01.72 ID:JnpjOAnv.net]
>>775
BlockingCollection使えばいいだけじゃねーの?

801 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 06:51:21 ID:M/JmLjh0.net]
>>776
それ、イベント発行しないと止まらなくね?

802 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 11:45:01 ID:Fn7VYFHg.net]
>>777
concurrent_queueって標準であります?どれのこと?
MT安全なqueueクラスを作ると
イベント待ちしてるときのstopで即終了が面倒かなと思いました

803 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 12:06:11 ID:Fn7VYFHg.net]
>>781
そうなんですよね
runningのチェックって一回のままで実現できないですかね?

804 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 12:18:21 ID:Fn7VYFHg.net]
>>780
BlockingCollectionってどこにあります?
ぐぐったらC#のクラスは見つかりましたが
上に書いた通り、stop時の処理がまわりくどくなりそうなのを気にしてます
実行時のロジックがシンプルなやり方を追求したいです

805 名前:843 mailto:sage [2020/05/08(金) 12:23:41 ID:UXU8nfWQ.net]
>>784
> BlockingCollectionってどこにあります?
> ぐぐったらC#のクラスは見つかりましたが
触れちゃ駄目な人だったか…

806 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 12:39:35 ID:N+8ZKU+/.net]
普通は終了を意味する番兵オブジェクトを用意するんじゃないの
キューの中身を最後まで処理して欲しいなら単に番兵を積めばいいし、無理矢理終わらせたいならキューを強



807 名前:ァ的に空にしてから番兵放り込めばいい []
[ここ壊れてます]

808 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 13:50:27 ID:Fn7VYFHg.net]
>>786
なるほどそれだときれいに書けますね
runningフラグは不要にできると

しかしわりとクリティカルな処理を想定してるので
stopを呼ぶスレッドで(イベントオブジェクトの)解放処理が起るのは問題に
なるかもしれないです(例ではintですが実際はもうちょっと凝った構造体)
runningフラグ前提だときれいに書けないですかね?

809 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 17:13:05 ID:+t+L26mC.net]
こんなんでいいのでは。running2回チェックは避けられそうにないなあ。チェックよろ
start() {
{
lock()
running = true
}
run(loop)
}
stop() {
{
lock()
running = false
}
notify()
join()
}
loop() {
lock()
while(true) {
cond_wait(!empty() or !running)
if (!running) {
break
}
pop()
}
}

810 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 17:29:10 ID:NOJZfKLR.net]
スレッド動作トリガーはcond 1個にして
スレッド内で、キューやrunningフラグを見る

811 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 17:32:31 ID:NOJZfKLR.net]
Windowsみたいな高機能な同期が有れば
イベント、タイマー、ファイルアクセス、ネットワーク通信
などなど色々な物を同時にトリガーに出来る

linux系はその辺が貧弱
スレッドを動かす為のスレッドが必要になったりする

812 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 17:46:30 ID:+t+L26mC.net]
>>790
全部selectやepollでまとめて待てるけど、winはもっと高機能なん?

813 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 18:43:53.40 ID:NOJZfKLR.net]
yes

814 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 19:10:58 ID:Fn7VYFHg.net]
>>788
インデントつけました

void loop() {
  lock()
  while (true) {
    cond_wait(!empty() or !running)
    if (!running) {
      break
    }
    pop()
  }
}

cond_waitの前にrunningみなくて大丈夫ですかね?
startの直後loopが始まる直前でstopが呼ばれた場合cond_waitって起きます?

815 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 19:27:16 ID:V12mYFi1.net]
>>792
違いは同期オブジェクトを含められるかどうかぐらいでは?
それ以外ならlinuxでもたいていfdになってる
少なくとも>>790の後ろ三つは可能
イベントもパイプで代用できることが多い

816 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 20:07:48 ID:DADrWmcq.net]
>>793
cond.waitはブロックする前に一度条件式を確認する動きになってる。
条件式が初めからtrueであればそもそもブロッキングをしないからcond.waitの前にrunningをみなくても大丈夫だと思う



817 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 20:36:08 ID:Fn7VYFHg.net]
>>795
そうでしたか
ありがとう

818 名前:デフォルトの名無しさん mailto:sage [2020/05/08(金) 22:51:30 ID:Fn7VYFHg.net]
もうひとつ質問させてください
>>776 のrunningはstd::atomic_boolにする必要はあります?

C言語だとこの手の変数はvolatileにすると思うのですが
C++ならatomicでしょうか?
上の方でatomicのこといろいろ書いてありますがこの場合はどうなんでしょう?

819 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 00:53:16 ID:8wHk9BWj.net]
void Foo::pushReq(const XXXReq& req)
{
 EnterCriticalSection(&m_csec);
 {
  if (!m_bTerminate) {
   m_requests.push(req);
   SetEvent(m_hEvtNewRequest);
  }
 }
 LeaveCriticalSection(&m_csec);
}

820 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 00:57:33 ID:8wHk9BWj.net]
bool Foo::popReq(XXXReq& req)
 for (;;) {
  if (!m_bInOperation) {
   // イベント待機
   WaitForSingleObject(m_hEvtNewRequest, INFINITE);
   if (m_bTerminate) {
    return false;
   }
   m_bInOperation = true;
  } else {
   EnterCriticalSection(&m_csec);
   {
    if (m_requests.empty()) {
     m_bInOperation = false;
     // 今入っているイベントはbInProcess中に入ったもので
     // 明らかに古いのでリセット
     ResetEvent(m_hEvtNewRequest);
    } else {
     // 要求があればpopして処理
     req = m_requests.front();
     m_requests.pop();
    }
   }
   LeaveCriticalSection(&m_csec);

   if (m_bInOperation) {
    // 処理すべきリクエスト有り
    break;
   }
  }
 }
}

821 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 01:01:13.28 ID:8wHk9BWj.net]
ウィンド

822 名前:ーズの同期APIの仕様により
同期API呼び出し時点であらゆる変数のメモリへの書込みとメモリからの読み込みが完了するので
とくにvolatileは不要
なはず、
[]
[ここ壊れてます]

823 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 06:06:39 ID:1JWVR6vl.net]
>>797
>>788のようにrunningの更新をlockで保護するのであればatomic_boolにする必要はないと思うよ
void stop() {
  std::lock_guard<std::mutex> lk(mtx);
  running = false;
  cond.notify_all();
}
お手本でも普通のboolを使ってる
https://cpprefjp.github.io/reference/condition_variable/condition_variable.html
https://cpprefjp.github.io/article/lib/how_to_use_cv.html

824 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 11:17:56 ID:KZFWOt7Z.net]
>>801
loop()内のrunningは毎度メモリから読まれる必要があるので
C言語ならvolatileにすると理解しています
つまりループ内で最適化されてしまわないようにするためだと思います

これがC++だと仕様的にもともと問題ないのでしょうか?
逆に最適化がかかりにくくなってしまう気がします
ただ手元で実装したものは最適化かけていても確かに期待通り動いています

825 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 12:59:28 ID:1JWVR6vl.net]
>>802
POSIX準拠のシステムでは同時アクセスを防ぐ書き方(mutexによるlockとかstd::atomicによるstore/loadとか)
をすれば自動的にメモリ同期(メモリへのフラッシュ)が行われる作りになっていてvolatileとかを気にする必要がないらしい
https://yupo5656.hatenadiary.org/entry/20040618/p2

826 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 13:06:53 ID:8wHk9BWj.net]
>>802
>>776のコードの全体の当否はおくとして
while()の中でlockしているのであればlockされるブロックに出入りする際に
>runningは毎度メモリから読まれる
が実現されるからrunningフラグはvolatile無しでもむ無問題、

C++の標準的なlockの仕様は知らんがlockに出入りするときに
CPUのライトキューやリードキューに未処理のライトコマンドやリードコマンドが乗ったままだと
正しいロックにならないから普通のlockの実装ではメモリバリアを行う

メモリバリアはコンパイラに対してはイントリンシックな関数か何かとして定義されており、
それらの呼び出しのときコンパイラは空気を読んでレジスタに乗ったままの変数を放置しないはず…
(変数に対する副作用がある関数呼び出しとみなす



827 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 13:16:40 ID:2pLCfdPK.net]
POSIXスレッドはetchになってからようやく使い物になった
woody以前は酷い出来だったのは酔い思い出

828 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 13:46:46.99 ID:8wHk9BWj.net]
しかし以下のような実装のときrunningにvolatileが本当に要らないかどうかわわからん…

void bar() { (内部でlockを行う) }

====↓↓↓異なる翻訳単位↓↓↓====

void foo {
 bool running = false;  // runningはローカル変数
 while (running) {
  bar();  // 一見runninguへの副作用が考えられないシグネチャ
 }
}

どうやっているのかは知らんが、ウィンドーズの同期系API(上の例でbar()にあたる)は
うまいことやってくれる(と思う!

829 名前:◆QZaw55cn4c mailto:sage [2020/05/09(土) 13:51:04 ID:y1dzFt5u.net]
>>803
というか、pthread や pthread 採用の C++11orlater で記述するのが普通です
volatile のみでなんとかするようなものじゃない

830 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 13:52:06 ID:8wHk9BWj.net]
よく考えたら上のコードではrunningへのポインタを他のスレッドが知っていることもありえないから、
そういう意味でvolatile不要(最適化上等)か…orz

一方、runningがグローバル変数なら、異なる翻訳系で定義された関数を呼び出した後に、
runningは改めてメモリから読まれることはコンパイラが生成するコードの規定の動作なので
volatile不要

まとめると、runningがグローバル変数でありかつ同期目的の関数内でメモリフェンスしており、
かつそこが毎回通る限り、runningにvolatileは不要

831 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 13:53:07 ID:VRhqXw ]
[ここ壊れてます]

832 名前:8t.net mailto: >>806
running がローカル変数なら bar() での副作用は無理だから volatile の有無によらず foo() は空にできちゃうのでは?
[]
[ここ壊れてます]

833 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 13:54:44 ID:VRhqXw8t.net]
(リロードしてなかった・・・)
>>808 つまり volatile が必要なケースは無いね?

834 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 14:01:00 ID:8wHk9BWj.net]
>>810
多分、orz
計算機科学や実際のプログラムの実装は複雑怪奇なので、
病的な反例が何かあるかも((((;゚Д゚))))ガクガク

835 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 14:22:58 ID:KZFWOt7Z.net]
>>803
それはメモリバリアのことですよね
つまりCPU内のリオーダーの制御で
lockからunlcokまでメモリアクセスはその外にリオーダーされることがない

>>802 で気にしてるのはそれではないです
レスわけます

836 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 14:32:48 ID:KZFWOt7Z.net]
>>804
> >>802
> >>776のコードの全体の当否はおくとして
> while()の中でlockしているのであればlockされるブロックに出入りする際に
> >runningは毎度メモリから読まれる
> が実現されるからrunningフラグはvolatile無しでもむ無問題、

一度目はメモリから読まれるのは確実だと思います
ただループの場合、2度目のリードからはコンパイラが最適化をかけて
一度目の値を使いまわす可能性があると思います

void loop()
{
  unique_lock lock(mtx);
  auto r = running
  while (r) {
    ....
  }
}

と置き換えてしまう可能性があるのでは?ということを心配しています
私のC言語開発の経験ではこの場合はvolatileにするのが鉄則でした

c++のコンパイラはかしこくrunningは都度メモリから読み出すべしと判断していると
なるとその判定はどうやって行っているのでしょう?
一律にローカル変数以外はメモリから呼び出すわけではないと思います
(それだとかなり性能が落ちると思います)



837 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 14:56:31 ID:8wHk9BWj.net]
>>813
コンパイラ視点で見れば中身のわからないcond.wait()と言う関数呼び出しが
グローバル変数runningに対する副作用を持たない(値を書き換えない)ことの保証が無いから、
cond.wait()をループ外にくくりだす最適化が行われることは普通は無い。 --- (A)
また、ソースコード上cond.wait()を呼び出した後にrunningを参照する箇所があれば、
普通はかならずメモリからrunningを読み直すコードが吐かれる --- (B)

普通でない場合というのはコンパイラがcond.wait()メソッドの中身まで知っていて
runningに対する副作用が無いと結論付ける場合が考えられるが、
それでもcond.wait()の中で
 (1) メモリバリアを行っており、
 (2) その意味をコンパイラが知っている
限り、コンパイラが「(cond.wait()呼び出しによる)runningに対する副作用が無い」と結論付けることはありえない --- (C)

というわけで、普通は(A)、(B)が成立するからrunningのvolatileは不要
(A)、(B)非成立な変に賢いコンパイラでも、(1)と(2)が成立するなら(C)が成立するからrunningのvolatileは不要

838 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 15:08:39 ID:1JWVR6vl.net]
>>813
ループは>>793の方法で行くんじゃなかったの

839 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 15:08:46 ID:KZFWOt7Z.net]
>>814
それはstd:::condition_variableを使った場合に限定していますか?
基本的にpthreadのwrapperだと思うのですが、仮にコンパイラがそれを特別扱いしているとすると
pthreadをダイレクトに使った場合はどうなりますか?
あと客観的な文献を示してほしいです

840 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 15:11:10 ID:KZFWOt7Z.net]
>>815
そうですが別の話題なのでわかりやすく書きました
ただ >>793 もイベント処理中はunlockしておく必要があったのでそこは変えました

841 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 15:20:05 ID:1JWVR6vl.net]
>>817
それだと>>813のコードでwhile(r) (あるいはwhile(running))ってなってるのがわからない
>>793だとwhile(true)の中でif(!running)ならbreakするって形でそもそもrunningは一回しか評価しないはず

842 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 15:38:10 ID:8wHk9BWj.net]
>>816
>それはstd:::condition_variableを使った場合に限定していますか?
いいえ

>pthreadをダイレクトに使った場合はどうなりますか?
どう使うつもりかわわからんが、コンパイラに中身を知りようが無い関数の
呼び出しがループ内に生じる限り同じ話

>客観的な文献を示してほしいです
(1) 変数に対する副作用がある(かもしれない)関数がループ外にくくりだされないこと
 コンパイラはソースコードをオブジェクトコードに翻訳する際、
 ソースコードに書かれたアルゴリズム(有限ステップで終わる&非同期要素無し)の
 動作結果を変えてはならない。この原則はコンパイラの教科書に書いてあるし常識と言っても過言ではない
 で、変数に対する副作用がある(かもしれない)関数の不適切な最適化はこの原則にひっかかる

(2) 少なくともMSVCがメモリバリアの意味を知っている根拠
https://docs.microsoft.com/ja-jp/cpp/intrinsics/readwritebarrier?view=vs-2015
これ、VS2010までは非推奨ではなかったし、サンプルコードも載っていたが無くなってたorz

843 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 15:40:22 ID:VRhqXw8t.net]
>>816
標準スレッドライブラリを使った前後の読み書きについては、
ライブラリ関数呼び出し( lock/unlock など)が提供するスレッドをまたぐ "synchronize with" 関係と
スレッド内での, "sequenced before/after" による前後関係とをつないだ
"inter-thread happens before" 関係(順序付け)に基づく挙動が規定されている。
https://timsong-cpp.github.io/cppwp/n4659/intro.multithread#intro.races-9
>813 のような書き換えは許されない。

規格化以前の pthread などをダイレクトに使った場合は >>814 の挙げるような
「事実上問題にならない」に頼ることになり、これに volatile を加えても「事実上問題にならない」の
範疇であることに変わりはない。
問題の可能性が減ったり、実際に起こっていた問題の解決につながることはあっただろうけどね。
これについては「客観的な文献」といったものが無かったことも規格化の動機になっただろう。
https://isocpp.org/wiki/faq/cpp11#cpp11-specific-goals
> - Machine model and concurrency ? provide stronger guarantees for and better facilities
> for using modern hardware (e.g. multicores and weakly coherent memory models). ...

844 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 16:27:23 ID:KZFWOt7Z.net]
>>819
なるほど
つまりc/c++コンパイラの最適化において、
副作用がある(pure functionでない)関数があると、それをまたいだ
リオーダーや値の流用をすることはない

当然メモリバリアを張るcond(pthreadも含む)は副作用ありなので
これがループ中に存在する場合はrunningは毎度メモリから読み出されることになる

ということですね
非常によくわかりました

845 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 16:30:24 ID:KZFWOt7Z.net]
>>819
しかし、この場合volatileが不要といえることはわかりましたが、
これはあくまで副作用あり関数の存在に依存しています

と考えると一般的にはvolatileはつけておく方習慣の方がやはり無難だと思いますがいかがでしょう?
(c++ならatomicに置き換えるとして)

846 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 16:33:07 ID:KZFWOt7Z.net]
>>820
ありがとうございます
ちょっとこれを読み解くのは難しそうですね・・・
あとでじっくり読んでみます



847 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 16:41:37 ID:8wHk9BWj.net]
>>821
レジスタに載ったままな変数の流用はともかく、
リオーダーは副作用がある(pure functionでない)関数をまたいでも特に阻害されないんじゃね;
リオーダーの効果はプログラムの実行に関して普通の状況では透過的なので、普通の状況でコンパイラがそれをやめさせる理由が無い

普通でない状況としては>>716みたく同一データに対する複数コアからの同時アクセスがありえるケース
(コンパイラが知りようが無い非同期事象が生じるケース)があるが、
これは(ユーザーコードかライブラリの)プログラマがメモリバリアを明示的に書き、
コンパイラが空気を呼んでその前後の変数の流用も抑止することで処置される

と思うが真実は知らん
気分としてはあくまで>>802の立場であって非同期の問題に関してはノーコメント
事実として出来上がったプログラムが正しく動いているなら問題ないのじゃガッハッハッハ、

848 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 16:43:21 ID:8wHk9BWj.net]
訂正orz
誤: >>716 ==> 正: >>776
誤: >>802 ==> 正: >>811

849 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 17:00:35.76 ID:1JWVR6vl.net]
>>822
複数スレッドで共有する変数を読み込む以上絶対にlockなりatomicなり

850 名前:使うわけだから必ず副作用あり関数が存在する []
[ここ壊れてます]

851 名前:はちみつ餃子 mailto:sage [2020/05/09(土) 18:56:58.72 ID:MmeKQuXy.net]
>>822
見かけ上の挙動が仕様通りだったらどうコンパイルしてもよいというのが言語としての基本的なルール。
https://timsong-cpp.github.io/cppwp/n3337/intro.execution
昔は並列実行に関する動作モデルの既定がなかったので、
既定にないことをするプログラムを書いたときに
最適化で除去されたり順序が入れ替わったりしてもそれは仕様通りだったんだよ。

volatile はプログラムとして書いてある通りのことを (たとえ観測できなくても) 実際の動作にも
反映させろというヒントをコンパイラに伝えるものではあるけど、
言語仕様の記述に用いられる抽象機械と実際の実行環境が完全にマッピングできるわけでもない
から volatile が具体的にどう影響するかってのは分からん。
言語仕様外のことをするときのために用意されていると考えてもいい。

つまり、ロックやアトミックまわりの仕様で規定されていることなら volatile を付けようが付けまいが
その通りになるし、既定されていないことなら volatile を付けても言語仕様として得られる保証は何もない。
処理系として言語仕様以上の保証を付けているということはあるだろうけど。

852 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 18:58:03 ID:KZFWOt7Z.net]
>>826
確かに、正しく排他制御しているのならばそれはいえそうです

853 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 19:14:29 ID:TBKnesgm.net]
volatileは簡潔に言うとregisterの逆の作用だね

854 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 22:27:01 ID:IGvav/BT.net]
volatileはコンパイラに、コード通り読み書きを行うコードを吐けと指示するだけ

CPUが勝手に順番を変えたりしないようにCPUに指示をする命令は別途行わなければならない

x86の場合は何もしなくて良い場合が多く
ARMの場合は追加しなければならない場合が多い

855 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 22:31:00 ID:TVkAIoUw.net]
いいえ、単に昔からGCCが糞なだけです。

856 名前:デフォルトの名無しさん mailto:sage [2020/05/09(土) 22:42:09 ID:G+eyUkVB.net]
最近日本式のやつが再注目されてるじゃないか。
それは欧州式のやつのことじゃないか?



857 名前:843 mailto:sage [2020/05/09(土) 23:22:12 ID:NXsGMAUL.net]
>>826
片方は書き出し、もう一方は読み出しだけなら排他制御しなくてもアトミックでありさえすれば大丈夫だし、そういう実装はそれなりにあるよ

858 名前:デフォルトの名無しさん [2020/05/10(日) 02:46:29 ID:EdgxbLB4.net]
可変長引数テンプレートから型の文字列を組み合わせて配列を定数化して取り出せるようにするために
以下のようなコードを書いたのですが、

template<typename ... ComponentsData> struct ComponentTypeGroup {
static constexpr std::size_t ComponentCount = sizeof...( ComponentsData );
static constexpr std::string_view TypeTexts[ComponentCount];

template<typename Type> constexpr void TypeGroupText( std::size_t _uIndex ) {
TypeTexts[_uIndex] = Detail::Nameof<Type>(); // 定数文字列を生成する関数です。
}

template<typename First, typename Second, typename ... ArgTypes> constexpr void TypeGroupText( std::size_t _uIndex ) {
TypeGroupText<First>( _uIndex );
TypeGroupText<Second, ArgTypes...>( _uIndex + 1 );
}
constexpr ComponentGroup(){ TypeGroupText<ComponentsData...>( 0 ); }
};

constexpr ComponentGroup()で「型指定子がありません」と出てコンパイルエラーが取れません。
何故このエラーが出ているのかがいまいちわからず、途方に暮れています。
誰かご教授いただけないでしょうか?

859 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 02:51:01 ID:KxiPn0ce.net]
ComponentTypeGroupのtypoでなくて?

860 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 03:20:50 ID:s7BT3+bq.net]
まずそのインターコンチネンタルホテルみたいな長ったらしい名前やめろ

861 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 03:25:28.56 ID:wE52EU/R.net]
古いコードの一時的メンテのため、stdとstd::tr1をC++11で混在

862 名前:ウせて使う話なんですが、
元々C++11以前のコンパイラ用に書かれた
using namespace std;
using std::tr1::shared_ptr;
shared_ptr<Hoge> hoge = ...

みたいなコードをC++11でビルドすると、C++11には std::shared_ptr があり ambiguous エラーになりますよね。

最初 share_ptr を std::shared_ptr ということにしてビルドしようかと思ったら、ところどころ std::tr1::shared_ptr と
フル宣言してあり面倒なことが判明。なので shared_ptr は std::str1::shared_ptr とみなす方針に戻りました。

なので using namepace std; を保持しつつ shared_ptr を std::tr1::shared_ptr としてビルドしたいんですが、
それって可能でしょうか? 例えば using namespace std; で std::shared_ptr を除外するようなことってできます?

古いコードを出来るだけいじらずビルドしたい、というのが一番のポイントですw
[]
[ここ壊れてます]

863 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 03:46:29.57 ID:oMXEUzlE.net]
単に#include<tr1/memory>してstd::tr1::shared_ptrのusingを消すんではあかんの?
新しいコンパイラではstd::shared_ptrとstd::tr1::shared_ptrって同じものでしょ

864 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 05:06:37.17 ID:wE52EU/R.net]
>>838
using std::tr1::shared_ptrを取るとただのshared_ptrはstd::shared_ptrになります (using namespace std)。
すると今回の場合、
 std::tr1::shared_ptr<Hoge> boge; // たまにちゃんと名前空間を使ってる宣言がある
 boge = shared_ptr<Hoge>(new Hoge);
みたいなコードが駄目になるようですが。

std::tr1::shared_ptrとstd::shared_ptrはとりあえず名前としては違うんじゃないですか? 違うとコンパイラー
が認識しているように見えますが。

865 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 11:05:22 ID:sYQDYC6t.net]
淫乱チンポメンタルヘルス?

866 名前:◆QZaw55cn4c mailto:sage [2020/05/10(日) 11:14:15 ID:PNwCDTcQ.net]
>>840
それ、面白いと思ったのですか?



867 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 11:25:22 ID:5OK5MvZd.net]
>>837
これで全部 std::shared_ptr になるんじゃない?
namespace std { namespace tr1 = ::std; }

868 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 11:49:35.32 ID:sYQDYC6t.net]
インサートチンポレンタルホテル!

869 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 12:12:32 ID:6Ru0pW3/.net]
>>842
> namespace std { namespace tr1 = ::std; }

おお、これで std名前空間の中に tr1 のエイリアスを定義できる感じですか?
結果 std::tr1 は ::std -> std を指す、と。

870 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 12:19:21.29 ID:KGOVLWXM.net]
>>834
constexpr ComponentGroup()の返り値がない。

constexpr void ComponentGroup()じゃない?

871 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 12:49:31 ID:uBqrUzQt.net]
コンストラクタの綴り間違えているんじゃね?
何れにしろconstexpr static memberをコンストラクタやメンバ関数内で初期化は出来ないと思うが。
やるならstatic constexpr member関数の戻り値で初期化するとかしないと

872 名前:デフォルトの名無しさん [2020/05/10(日) 13:27:57 ID:EdgxbLB4.net]
>>845
>>846

あ……すみません。
コンストラクタの綴り治せばエラー取れました(汗
ご教授ありがとうございました

873 名前:デフォルトの名無しさん [2020/05/10(日) 17:58:29 ID:Pcmn53iK.net]
namespace std { inline namespace tr1 {} }

#include <memory>

874 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 18:02:33.35 ID:LV0wbaaG.net]
std名前空間に何かするのは基本的に未定義動作に繋がるのでやめようね

875 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 18:15:05 ID:3khm8gAC.net]
カラオケで自分が歌いながら録音したカセットテープを爆音でドライブしながら女に聞かすようなものだな
これどう?オレが歌ってんだけど?的な

876 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 18:53:54 ID:0gvZuU03.net]
>>850
それ良くやる



877 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 19:05:46.41 ID:m91+LxrO.net]
女「さむっ・・・オープンカーかと思ったわ」

878 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 19:30:31.12 ID:657zsB50.net]
>>848
どうもです、しかし

879 名前:自分の環境だとうまくいかないですね。gcc 5.4.0 です。
error: ‘shared_ptr’ is not a member of ‘std::tr1’
std::tr1::shared_ptr<Hoge> hoge;
^
とりあえず>>842を試してみたんですが、やってみるとインクルードファイルが意外と多く、そのほとんどに
#include <tr1/なんちゃら> があり、これらを全て tr1無しにする必要が。
コンパイラーのフラグ等でtr1無しをインクルードするようなことってできましたっけ? うわーさらに脇道。

とりあえず上記を書き直すとした場合、変更量が増えるにつれ、やっぱ全部のファイルで素直にtr1を
全部置換したほうがいいんじゃないかという気が徐々に... っておい > 自分

>>849
御意。ちなみにstdは普通の名前空間とは違うということですか?
しかし namespace の使い方の勉強になりました。いやあ色々思い付かれてすごいです。
[]
[ここ壊れてます]

880 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 19:41:27.78 ID:5OK5MvZd.net]
>>853
#include <tr1/〜> も保持するなら、自分のソースツリーに tr1/〜 を捏造して
その中に #include <〜> と >>842 を並べて書けばいいでしょ。

まぁ置換で済むならそっちだろうけど。

881 名前:デフォルトの名無しさん mailto:sage [2020/05/10(日) 21:40:19.38 ID:LV0wbaaG.net]
>>853
std名前空間の中は標準とその実装のための特別な場所
https://ja.cppreference.com/w/cpp/language/extending_std

882 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 06:44:06 ID:WjiQACf7.net]
使われないけど標準なんです。

883 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 10:06:29 ID:ihiMo4aq.net]
関数内で宣言した変数を途中でconst化したいときってどうやったらいいですか?
関数というのはこんな感じです

void func() {
int a;

〜aの値を設定する百行くらいの処理〜

〜aを用いたメイン処理。途中で誤ってaを変更しないようにしたい〜
}

aをconstで宣言しておいてaを設定するところはconst_castするというのはやりたくないです。
初期化用関数initializeを作って const int a = initialize(〜); とするしか方法はないですか?
できればそれもしたくないのですが

884 名前:デフォルトの名無しさん [2020/05/11(月) 10:09:55 ID:MhpqGE2N.net]
&a にアクセスする権限を readonly にするとか
環境依存だろうけど

885 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 10:13:30 ID:vLTbwMZ+.net]
>>857
a に設定する値を求める処理を関数化して、その戻り値でconstのaを初期化する。

886 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 10:14:29.69 ID:vLTbwMZ+.net]
あ、したくないって書いてあったね



887 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 10:18:49 ID:m+8/4tPw.net]
>>857
初期化用関数を作るのが嫌な理由は何?
外のスコープに名前を付けて置くのが嫌ということならラムダ式で済むと思うんだけど。

888 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 10:53:26 ID:ihiMo4aq.net]
>>859>>861
関数作るのが嫌なのは、気分ですね。バカバカしい理由ですみません。

関数外に置くのが嫌でラムダ式は多用しているのですが、使うときはある程度まとまった処理をするときなので
初期化程度のことにラムダ式を持ち出すのは大仰な気がしてやりたくありません。
これまた個人的な好みで恐縮ですが。

(ちなみに>>857で挙げた初期化処理が百行くらいというのは大げさで、概ね数行くらいです。)

889 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 11:22:30 ID:rmb+jfMY.net]
どうしてもなら、こうだな
int a_;
//a_で初期化処理をする
int const& a = a_;
//aはconst

890 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 11:26:38 ID:rmb+jfMY.net]
アホらしいけど、こんな手も考えられる
struct sample
{
int a;
void func() {
//初期化処理
std::as_const(*this).func();
}
void func() const {
//aをconst扱い
}
};

891 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 11:30:27 ID:tShYcoYg.net]
後半をlambda化すれば
aをコピーキャプチャしてmutableにしなければconstになる

892 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/05/11(月) 11:37:55 ID:p ]
[ここ壊れてます]

893 名前:GzfxkdL.net mailto: GCC や Clang の拡張を使ってよいならこういう書き方は出来る。

void func() {
const int a = ({int a; a=1; a;}); // ブロック内で初期化処理を書いて値を返す
std::cout << a << std::endl; // メイン処理
}

たぶん >>857 が考えている用途だとこれが一番楽なんじゃなかろうかと思うんだけど、
標準ではないってのはやっぱりネックになってくるな。
[]
[ここ壊れてます]

894 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 11:54:09 ID:WjiQACf7.net]
constウイルスw

895 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 12:17:38.26 ID:oXH9qZIA.net]
ポインタ使えばいいのに
const付きのポインタを宣言だけしといて初期化のスコープ内でアドレス渡せばいい

896 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 12:21:06.88 ID:vUv7mwxB.net]
>>862
RAII教に入信しておとなしく初期化ラムダ関数を使うがよい



897 名前:デフォルトの名無しさん [2020/05/11(月) 14:54:10 ID:NX9zuntd.net]
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

898 名前:デフォルトの名無しさん [2020/05/11(月) 14:54:11 ID:NX9zuntd.net]
IT掲示板群 ttp://x0000.net/forum.aspx?id=15

学術の巨大掲示板群 - アルファ・ラボ ttp://x0000.net
数学 物理学 化学 生物学 天文学 地理地学
IT 電子 工学 言語学 国語 方言 など

simulationライブラリで純粋な関数式プログラミングをする
ttp://x0000.net/topic.aspx?id=3631-0
UIライブラリ (C#, 2D) を作ったよ
ttp://x0000.net/topic.aspx?id=3688-0
連続と離散を統一した!
ttp://x0000.net/topic.aspx?id=3709-0
4Dエンジン
ttp://x0000.net/topic.aspx?id=3677-0
matrixのライブラリ
ttp://x0000.net/topic.aspx?id=3711-0
ある強力なFor関数
ttp://x0000.net/topic.aspx?id=3630-0
SQLライブラリ
ttp://x0000.net/topic.aspx?id=3675-0

899 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 14:58:27 ID:vIusnhzf.net]
>>868
なるほど、考えてみれば参照型にすればいいんだ。
int a;
(a に対する初期化処理);

const int &a2 = a;
(a2 を読み取るだけの処理);

900 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 15:01:13 ID:vIusnhzf.net]
変数名として灰化の用にすればわかりやすいかもしれない。
物理学では、a0 は、a の初期値を意味することが多いので、学術的にも分かり易い。

int a0;
(a0 に対する初期化処理);

const int &a = a0;
(a を読み取るだけの処理);

901 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 15:02:26 ID:rdm6Cg4w.net]
>>873
誤: 変数名として灰化の用にすればわかりやすいかもしれない。
正: 変数名としては、以下のようにすれば分かり易いかも知れない。

902 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 15:28:25 ID:ZT/W926b.net]
a0がスコープから消えないのは片手落ち
どのみちトリッキーなことして読み手を混乱させることしない方がいい
単純にスコープを一画面に収まるぐらいに短くしろ

903 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 15:33:11.51 ID:rmb+jfMY.net]
キモい個人サイトの宣伝をNG登録っと

904 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 16:16:12.98 ID:rdm6Cg4w.net]
>>875
>a0がスコープから消えないのは片手落ち
言われてみれば。

905 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 16:35:15 ID:gZOsi0FN.net]
処理を途中で止めて、変数とかvectorの中身を確認したりするソフト知らない?

906 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 16:37:43 ID:rdm6Cg4w.net]
>>875
以下のようにすればその問題も一応は解決する。

int a;
(a に対する初期化処理);

{
 const int &a0 = a;
 const int &a = a0;  // 外の a とは別の a を宣言。
 (a を読み取るだけの処理);
}

さらに
#define XXX(_x_) const int &_x_##0 = _x_; const int &_x_ = _x_##0
というマクロを導入すれば、

int a;
(a に対する初期化処理);

{
 XXX(a);
 (a を読み取るだけの処理);
}

でいける。



907 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 16:38:36 ID:rdm6Cg4w.net]
>>878
それがデバッガー。
IDEの中に入ってる。

908 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 16:59:50 ID:rmb+jfMY.net]
>>878
Visual Studioに標準で入ってるよ

909 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 17:54:34.39 ID:ihiMo4aq.net]
やはり大人しく初期化関数使います
いろいろとアドバイスありがとうございました

910 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 18:09:25.84 ID:UkUll7O4.net]
幅優先探索において座標によって侵入コストが均一でない場合に対応するためにプライオリティキューを用いて、
スタート地点からの総移動コスト値(int)を格納する2次元配列と、
それに対応するインデックスとなる座標を格納する構造体(POINT)で実装したいのですが、
ProgrammingPlacePlusというサイトのC++編の「標準ライブラリ」の第12章(priority_queue)のサンプルコードに習って、
使用コンテナがvectorの場合はうまくいくのですが、listにするとコンパイルエラーになってしまいます

int move_cost[256][256];

bool operator >( POINT a, POINT b )
{
return ( move_cost[a.y][a.x] > move_cost[b.y][b.x] );
}

//vector版
std::priority_queue< POINT, std::vector<POINT>, std::greater<POINT> > vector_prio_que;

//list版
std::priority_queue< POINT, std::list<POINT>, std::greater<POINT> > list_prio_que;

初心者ですみません
どうすればlistでも動作させられるのかご教示頂けませんでしょうか

911 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 18:20:43.09 ID:rmb+jfMY.net]
>>883
vectorならokでlistはngというと、イテレータの種類じゃね?
vectorはランダムアクセス、listはバイディレクショナルという違いがあって
よく引っかかる要注意箇所だよ

912 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 19:14:29 ID:UkUll7O4.net]
priority_queueの内部使用コンテナとしては、vector、list、dequeは条件を満たしていると書いてあったので、できるはずだと思ったのですが…

priority_queueは、topメンバ関数で最も優先度の高い要素にしかアクセスできず、
自分で書いたソースでは添え字やイテレータによる直接のアクセスは行っていない
(メンバ関数も、.push .pop .top .emptyしか呼び出していない)のですが、
コンパイルエラーの表示では、ご指摘のとおりリバースイテレータがどうのと出ていました

error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)'
:テンプレート引数を 'const std::reverse_iterator<_RanIt> &'に対して 'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
'std::operator -' の宣言を確認してください。

これは内部的にイテレータの操作がされておりそこでエラーになっている感じなのでしょうか?
algorithmやxutilityの該当箇所を見ても難しすぎてわかりませんorz

913 名前:◆QZaw55cn4c mailto:sage [2020/05/11(月) 19:16:21 ID:X9lKtqAV.net]
>>866
例の奴ですね、ならば、ここはラムダ式の出番でしょう、ラムダ式を定義して即評価します
const int a = [](){int a; a = 1; return a; }();

私以外にもこういうのを希望する人がいるということで、安心しました

914 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 19:28:56 ID:VXScjWrk.net]
> priority_queueの内部使用コンテナとしては、vector、list、dequeは条件を満たしていると書いてあったので
それってどこ情報?
軽くググった限りだと、vector、dequeしか出てこないけど

915 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 19:48:22.07 ID:UkUll7O4.net]
Programming Place Plus というサイトで配布されていた オフライン版(2019-07-01更新版)の C++編の「標準ライブラリ」の第12章(priority_queue)に書いてありました

916 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 20:14:46 ID:1e8qKpQP.net]
リファレンスにはvectorとdequeしかないね
https://ja.cppreference.com/w/cpp/container/priority_queue
https://cpprefjp.github.io/reference/queue/priority_queue.html



917 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 20:21:27 ID:UkUll7O4.net]
vectorの部分をdequeに替えたら問題なく動作したので、対応してるのvectorとdequeだけの可能性高そう
できゅーならできる、なんちゃって

918 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 20:42:44 ID:LZ5jZAGa.net]
(デックなんだけど楽しそうだから黙っとこう…)

919 名前:デフォルトの名無しさん [2020/05/11(月) 20:48:20 ID:oppF2e3I.net]
>>888
そのサイトが取り違えている

https://cpprefjp.github.io/reference/queue/queue.html
>要件を満たすものとしては deque と list

queue | Programming Place Plus C++編【標準ライブラリ】 第11章
https://programming-place.net/ppp/contents/cpp/library/011.html
>Container には、vector(第5章) や list(第6章)

***

https://cpprefjp.github.io/reference/queue/priority_queue.html
>要件を満たすものとしてはvectorとdeque

priority_queue | Programming Place Plus C++編【標準ライブラリ】 第12章
https://programming-place.net/ppp/contents/cpp/library/012.html
>Container には、deque(第7章) や list(第6章)

920 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 21:01:34 ID:UkUll7O4.net]
そこのサイト詳しくわかりやすく解説してくれているから頼りにしていたのですけど、間違いがあるとは残念ですね…
vectorは要素をずらしたりコピーしたりで実行速度が遅そうだと思ってlistを使いたかったのですが、
素人考えでしたかね

921 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 21:10:39.83 ID:1x7ET1G/.net]
dequeでよくね

922 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 21:30:43 ID:rmb+jfMY.net]
>>885
difference_typeって書いてあんじゃねえかよ
バイディレクショナルなイテレータは引けねえんだよ
つまりlistは使えねえってこと

923 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 21:33:07 ID:M5DpbX0A.net]
>>885
std::priority_queue
https://cpprefjp.github.io/reference/queue/priority_queue.html

ここには、vector・dequeがあると書いてある。
list は書いていない

924 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 21:37:14.43 ID:VXScjWrk.net]
priority_queueって内部実装がヒープみたいだから、
末尾にしか追加削除しないと思われるので、vectorで十分では

925 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 21:45:02.52 ID:1e8qKpQP.net]
コンセプトがくればこういう悲しい出来事も減るのかな

926 名前:デフォルトの名無しさん [2020/05/11(月) 21:47:53.20 ID:zAHWYKkR.net]
C++って何作れば勉強になるんだろ



927 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 21:54:43.39 ID:UkUll7O4.net]
縦10マス×横40マスの地図で幅優先探索を100回まわして時間計ったら、
vectorだと989ms
dequeだと904ms
で大差ないかんじでした
デフォルトのままvectorを利用していきたいと思います
アドバイス下さいました熟練者の皆さまありがとうございましたm(_ _)m

928 名前:デフォルトの名無しさん mailto:sage [2020/05/11(月) 22:38:15 ID:M5DpbX0A.net]
漏れは、2分ヒープを自分で作って、ソートしたりしたけど、

配列の[0]は使わず、[1]から始めると計算が楽なので、
親1, 左右の子は2, 3で、法則は親n, 子2n, 2n+1

コンテナの最後にオブジェクトを追加し、
それが親の数値より小さい場合は、
再帰的に親と交換していく (親子を交換)

再帰的に、親は両方の子以下の数値をもつ。
左右の子(兄弟)の大小関係は考慮しない

配列の先頭要素[1]をPopし、配列の最後の要素を、
[1]に持ってきて、そこから再帰的に、左右の子と比べながら、
子の数値より大きい場合は、入れ替える

ピッコロ大魔王は、これよりもさらに効率的な方法を言ってたけど

このアルゴリズムでは、deque のリンクは不要だろ?
親n, 子2n, 2n+1 で、メモリの場所が分かるのでは?

929 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/05/12(火) 00:41:18 ID:NsC/lgb+.net]
>>886
質問者はこの場面でラムダ式を持ち出したくないと >>862 に書いてある。
どうして文脈を読めんのだ。

930 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 01:32:23 ID:nCmEHjd6.net]
>>901
なるほど、n, 2n, 2n+1 番の要素に格納してゆくかんじですか、素晴らしいアイデアですね
自力での実装がどうしても必要になったら、配列で作るときのヒントにさせていただきますね

>vectorだと989ms
探索1回あたり10msもかかるのはちょっとおかしいだろうと思って見直したら、
ソリューション構成をDebugにして、「デバッグ開始」してるせいでした
ソリューション構成をReleaseにして、「デバッグなしで開始」にしたら、
探索1回あたり0.02ms弱に収まりました(vector使用時)
STLコンテナ使っててデバッグモードだと500倍も遅くなりうるのか…
ちなみにdeque使用時は0.05msでやや遅めだったのでやはりvectorを使う方がよさそう

931 名前:899 mailto:sage [2020/05/12(火) 02:06:26.24 ID:q3FkXSvr.net]
普通の実装では、[0]から始めると、
親0, 左右の子は1, 2で、親1, 左右の子は3, 4で、
親n, 子2n+1, 2n+2、となり複雑

子3なら親は、(3-1)/2 = 1
子4なら親は、(4-1)/2 = 1.5 で、切り捨てて1

>>901
では、配列の[0]は使わない。[1]から始めると計算が楽
親1, 左右の子は2, 3で、親n, 子2n, 2n+1

子2なら親は、2/2 = 1
子3なら親は、3/2 = 1.5 で、切り捨てて1

932 名前:デフォルトの名無しさん [2020/05/12(火) 09:47:29.30 ID:9iboxsgQ.net]
呼び出し履歴で過去の状態に戻れるのは、記録してるからだし。

933 名前:デフォルトの名無しさん [2020/05/12(火) 11:15:54 ID:4WwqN1hQ.net]
dequeue一択

934 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 11:26:05 ID:xLvzOPR4.net]
そういえばdeque使ってよかったって経験ないなぁ

935 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 11:33:14 ID:8l4UOEBM.net]
heap構造ならvectorが速いよね
事前に適切なサイズでreserveしておけば再配置も起きないし

936 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 11:52:31.54 ID:Jgs88fl2.net]
前後にニョキニョキ伸ばすような用途だとdequeが一番よ



937 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 12:41:24.29 ID:ph0RCKO5.net]
複数のソース・ヘッダーファイルのセットから一つの動的dllは作れないのでしょうか?

938 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/05/12(火) 12:45:13 ID:NsC/lgb+.net]
>>910
作れるよ。

939 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 13:34:11.63 ID:ph0RCKO5.net]
>>911
ありがとん
1つのソース・ヘッダーのセットから1つのdllを作るのには成功したのですが、解説サイトも見つからず困っています

940 名前:はちみつ餃子 mailto:sage [2020/05/12(火) 13:43:29.89 ID:NsC/lgb+.net]
>>912
ツールチェインによって手順は違うけど、
ソースファイルがひとつであろうが複数であろうが特別に違うことはしないと思うんだけど。

941 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 14:09:57 ID:j/0vQ47K.net]
何が困っているのかさっぱりだぜ
リンカでdllにするんだろ
複数のオブジェクトファイルをリンクすることになんの疑問が

942 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 14:15:34 ID:9Z5koysX.net]
BASICとかやってた部類の人間だとリンクの概念とかわからんかもね

943 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 14:17:43 ID:9Z5koysX.net]
そういう化石の人がつい最近いじりはじめた可能性もある

944 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/05/12(火) 14:18:45 ID:NsC/lgb+.net]
コマンドラインから使うときでもだいたいコンパイラドライバが
いい感じにやってくれるから細かなことまで意識する機会も
あまり無いしな。

945 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 14:24:47 ID:9Z5koysX.net]
昔は依存関係調べるメイクファイルビルダーみたいなの使ってたけど
今はそこら辺もコンパイラが全自動で全部やってくれる

946 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 14:24:51 ID:s06VnCgE.net]
なんかデジャブ…
つい数日前にもまとめてlib化はできるけどdll化できないって質問があったような…



947 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 14:24:57 ID:SVn+5d28.net]
>>914
おそらく本人は何も分かっていない、何が分かっていないか分からない、書いてあったことを真似るしか出来ない、ということなんだと思う。

948 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 14:30:14 ID:9Z5koysX.net]
写経から悟りを得るかどうかの瀬戸際という辺りか

949 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 14:32:49 ID:0QBBSU9v.net]
40年前の子供向けBASIC雑誌ですら動的生成を当たり前のようにしてたのになに言ってんだか
C++は何十年遅れてるのってレベル。ゲイツ舐めすぎ。おまえらはジョブス以下。

950 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 15:24:55 ID:j/0vQ47K.net]
プログラムからコンパイラ呼び出して動的ライブラリ作って呼び出せばいいじゃん

951 名前: mailto:sage [2020/05/12(火) 18:31:00.41 ID:cMBaML9B.net]
>>902
初期化時に別に関数やメンバ関数(メソッド)を立てたくない、という >>862 の要望は、かつて私も体感した感覚であり共感を覚えましたので、失礼だとは思いましたが背中を押す意味もこめて敢えてラムダ式を推すことにいたしました

952 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 19:33:06 ID:zY2j7Z+k.net]
MacだとCMakeが便利だった。

953 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 19:38:18 ID:HKiNDHJQ.net]
即時実行されるlambdaなんて
文法上殆んどblock変わらん見た目で、
最適化かければ性能上もblockと変わらんだろ

[&]{
}();

954 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 19:48:18.72 ID:Jgs88fl2.net]
即実行ラムダのインライン展開って本当にやってくれるの?
もちろんプログラマとしては期待するところだけど本当に主要コンパイラがやってるか誰か検証してる?

955 名前:デフォルトの名無しさん [2020/05/12(火) 20:13:21 ID:Qfzty+97.net]
一回しか呼ばれないんならインラインも糞も無い罠

956 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 20:26:40 ID:HKiNDHJQ.net]
>>927
そんなのアセンブリ出力するかobjdumpすりゃ確認できるだろ

msvcですらやっているよ



957 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 20:28:32 ID:u3gpKmNT.net]
普通の関数コールだって呼び元が1箇所ならインライン展開する

958 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 20:38:00.80 ID:Jgs88fl2.net]
そっかMSVCがやってるなら当然みんなやってるわな
サンクス

959 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 20:38:53.13 ID:u3gpKmNT.net]
いやそんな事もないけど

960 名前: mailto:sage [2020/05/12(火) 20:40:27.49 ID:cMBaML9B.net]
>>926
式しかかけない場所というのがあって、そういう場所では文では駄目ですね

961 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 21:12:01 ID:sL+fzMl7.net]
set::insert()で警告が出るんですが、なんででしょう?vc2015です。

std::set<int> items;
items.insert(1); // ここで警告 C4800

C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\utility(175): warning C4800: 'int': ブール値を 'true' または 'false' に強制的に設定します
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include\xtree(1823): note: コンパイル対象の関数 テンプレート インスタンス化 'std::pair<std::_Tree_const_iterator<・・・

962 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 21:13:55 ID:u3gpKmNT.net]
書いてある通りじゃね?

963 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 22:10:57.80 ID:sL+fzMl7.net]
>>935
メッセージ内容見ても全然意味がわからないです・・・
警告出ないようにするには、どう修正したらいいですか?
#pragma warning とかでなくて

964 名前:デフォルトの名無しさん mailto:sage [2020/05/12(火) 22:13:18.80 ID:8l4UOEBM.net]
コンパイラを代える

965 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 03:55:06.92 ID:FY0MfQzC.net]
std::set<int> items;
items.insert((int)1); //明示的キャスト

966 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 03:57:56.39 ID:4cp2IEvR.net]
なんでintのコンテナにint突っ込もうとしたら型警告出るんだろうな?
やっぱMSVCってクソだわ



967 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 06:13:43.32 ID:k7uwq6xu.net]
std::set::inster() の引数でbool型が優先されるのか。
どういうオーバーロードが作用してるんだろう。

968 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 06:24:21.32 ID:nnLD0aa0.net]
>>931
頭悪すぎw

969 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 06:25:48.91 ID:nnLD0aa0.net]
>>939
おまえがウジ虫だからだよw

970 名前:938 mailto:sage [2020/05/13(水) 08:02:38.51 ID:k7uwq6xu.net]
誤; std::set::inster()
正: std::set::insert()

1文字での入れ替わりは珍しくないけど、2字ずれちゃったのは何故だ?

971 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 08:08:13.33 ID:OofdoMNm.net]
両手でタイプしているとタイミングのずれでそうなることがある

972 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 08:09:03.26 ID:OofdoMNm.net]
しかしs, e, r, tすべて左手だな

973 名前:デフォルトの名無しさん [2020/05/13(水) 09:04:32 ID:JcjM8CgX.net]
ドッペルゲンガーだろね。

974 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 11:24:17 ID:FY0MfQzC.net]
即席打法inster

975 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 12:06:10.95 ID:xXY8eqGW.net]
>>924
自分も同じです
複数の変数の同時初期化が必要な場合も、前はタプルを返してたけど
c++17の構造化束縛のおかげでずいぶんスマートに書けるようになったと思う
こんな感じで
int i = 2;
int j = 3;
const auto [m, n] = [&](){ return make_tup

976 名前:le(i + j, i - j); }();

make_tupleの代わりにforward_as_tupleを使うと推論がうまくいかないことがあるけどラムダ式だからそんなもんかな
[]
[ここ壊れてます]



977 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 12:16:08 ID:VSt/R8YQ.net]
Set
https://cpprefjp.github.io/reference/set/set.html

コメントに、こう書いてあるけど、
// C++17から

978 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 13:45:03.91 ID:OofdoMNm.net]
C++17が現行規格で、C++14以前は廃止規格
ただし国内ではC++03が現行規格

979 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 13:48:57.81 ID:hlRp6n7l.net]
妙な理解してるな

980 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 18:26:46 ID:4cp2IEvR.net]
合ってるでしょ
JISの最新C++規格はC++03相当の翻訳(誤字誤訳脱文多数)で、今もそれが日本国内の正式な規格
従うメリットはないです

981 名前:はちみつ餃子 mailto:sage [2020/05/13(水) 20:14:04.10 ID:/XT35uGg.net]
ISO は国際的な性格をもつ機関で JIS は日本の機関だけど、
ISO の規格の全てが全世界で通用するわけではないし、
JIS 規格が日本国内だけの効力というわけでもない。
法律に反しない範囲で当事者の合意があればどんな規格だって有効だよ。
規格化活動の便宜のためにそれぞれが独立して活動してるだけなんで、
「JIS は」ならともかく「国内では」みたいな理解は誤り。

あと、「改正前」と「廃止」は別物。

982 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 21:36:34.19 ID:OofdoMNm.net]
よっぽど決まりを守りたくないんだね
そういう人を説得しようとは思わない

983 名前: mailto:sage [2020/05/13(水) 21:44:06.78 ID:k/cJlRBb.net]
>>954
例えば、JIS が C++03 までしかない、からといって国内では C++11 or later が無効、というわけではないと思います
また「C++14 は廃止された」という言い方はそもそも変です
現時点で C++14 で記述するという「決まり」を立てて C++14 でソフトウェアを作成するとどんな問題が発生するのですか?

あなたのいう「決まり」とはなんですか?

984 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 22:04:10 ID:KT7abTkK.net]
>>954
なんだこのバカ

985 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 22:28:38.42 ID:NqwOCnph.net]
C++03でもC++11でも何でも良い
空気を読んでコードが書ければ

組み込みだといまだにC++03の環境も多くあるから
C++03だけでも書けた方が良いし
C++14の機能を使ったコードが読めないのもマズい

986 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 22:31:02.14 ID:NqwOCnph.net]
#defineで動いていて評価も終わってるコードを
わざわざconstexprやインライン関数に書き換えるようなアホな事はするなよ



987 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 22:56:06 ID:FY0MfQzC.net]
constexprはそんなバカコード修正するために在るものじゃないし

988 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 23:33:51.70 ID:RlNw0pdB.net]
壊れていなくても直す…!

989 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 23:39:11.22 ID:FY0MfQzC.net]
カチャカチャやらなくてもそのうちバカコードをAIが直す時代がくるさ
シンギュラリティは近い

990 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 23:52:49.48 ID:j5LG6G0L.net]
constexprは既存コードを壊すために在る

991 名前:デフォルトの名無しさん mailto:sage [2020/05/13(水) 23:59:58.84 ID:GrmX4NGu.net]
constexpr大好き

992 名前:デフォルトの名無しさん mailto:age [2020/05/14(木) 00:50:00.59 ID:9MnQCjc/.net]
コンスとエクスパ

993 名前:デフォルトの名無しさん mailto:sage [2020/05/14(木) 02:04:29.95 ID:pTsZ6lRN.net]
#define N 100
#define square(x) ((x)*(x))
// 気持ちわる

994 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 05:49:32 ID:IJMYY156.net]
>>957
プロの現場ではC++03以降が敬遠されてるところをみると、
その空気とはC++は便利なCとでしか使ってはならないということだな。

多くはJava、C#、Python、rubyで十分だし。

995 名前:デフォルトの名無しさん mailto:sage [2020/05/14(木) 07:15:55.89 ID:Qhhsb9+b.net]
C++17には待ってました

996 名前:ニいう有り難い機能が色々あるのに
付いて来れない低脳に迎合するために使用禁止とか愚の骨頂だ
足引っ張るなぼけ
[]
[ここ壊れてます]



997 名前:デフォルトの名無しさん mailto:sage [2020/05/14(木) 07:16:46.37 ID:Qhhsb9+b.net]
不勉強は罪だぞ技術職では

998 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 08:03:23 ID:IJMYY156.net]
>>967
冗談はよし子さんw 待ってましたって自分で実装せずに待ってたの? ただの低スキルプログラマじゃんw
C++はいつも十年遅れて標準化するから使われない機能満載だよ。

stringが必要とされたのはいつですか? 実行時型情報が必要とされたのはいつですか? マルチスレッドが使われるようになったのはいつですか?

キミは30年遅れてるんだよ。時代錯誤君。だから糞遅いJavaに簡単にシェア抜かれるんだよ。

999 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 08:14:52 ID:Qhhsb9+b.net]
構造化バインディングなんか自分で実装できるわけねえだろアホ
何も知らないやつが頓珍漢なこと言ってんな

1000 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 08:17:40 ID:Qhhsb9+b.net]
それでプロとは笑わせるぜ

まあ、いるけどねHDDを指さしてメモリと言ったり
MTTR/MTBFを知らない「プロ」も世の中には

1001 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 08:18:39 ID:jtTfGo9Q.net]
Javaって言うほど遅いか
競プロに最適化問題を競って解く分野があるが、Java使いで世界トップクラスの選手複数いる

1002 名前:デフォルトの名無しさん mailto:sage [2020/05/14(木) 08:25:55.19 ID:IJMYY156.net]
>>970
まずは構造化バインディングの話をしようか。
キミはいつ頃この機能が必要になったのか、何の実装に必要になったのか詳しく聞かせてくれ。

そしてこの機能で今までどういった素晴らしいソフトを作ってきたのか紹介してくれ。
キミほどの優秀な技術者なら著名なプロジェクトを多数参加しているだろうしな。

1003 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 08:42:44 ID:Qhhsb9+b.net]
>>973
おまえなんかにタダでレクチャーなんかしねえし
身バレするような情報を出すわけねえだろ

おまえ頭がパーだな

1004 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 08:47:57 ID:IJMYY156.net]
答えれないと知ってて質問してるからいいよ。キミはコードを書かない側の人だからね。
プロジェクトでコード書く人は絶対にこんなこと言わない。こういうことはコードを書かない素人が言うこと。

> 有り難い機能が色々あるのに付いて来れない低脳に迎合するために使用禁止とか愚の骨頂だ
> 足引っ張るなぼけ
> 足引っ張るなぼけ
> 足引っ張るなぼけ

1005 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 09:11:55 ID:nTyJBG5I.net]
キモいのが湧いてるwwww

1006 名前:デフォルトの名無しさん [2020/05/14(Thu) 09:19:04 ID:QxbT6fEj.net]
>>969
よしこさんって書き込みたまに見かけるけど、なんで芳江さんじゃだめなん??



1007 名前:デフォルトの名無しさん [2020/05/14(Thu) 09:23:11 ID:QxbT6fEj.net]
>>972
遅くないよ。
C++の20倍速いってブログもあったよ。

1008 名前:デフォルトの名無しさん mailto:sage [2020/05/14(木) 09:27:45.71 ID:IJMYY156.net]
構造化バインディングの話をしたいのに誰もそっちには乗ってこないんだなw

一体誰がこんな機能待ってたんだろう 言い出した本人は逃げちゃったし

1009 名前:デフォルトの名無しさん [2020/05/14(木) 09:30:38.54 ID:QxbT6fEj.net]
>>979
別に話し合うことも無いと思うけど、何を話し合うの?

1010 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 10:34:07 ID:Qhhsb9+b.net]
>>975
本当に何も知らねえやつだな

> 絶対にこんなこと言わない

目の前に当てはまらない者がいて
言う前から論破されている戯れ言だぜ

1011 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 10:50:24 ID:T9ir0BrB.net]
>>966
逆じゃね

1012 名前:デフォルトの名無しさん mailto:sage [2020/05/14(木) 10:53:24.55 ID:T9ir0BrB.net]
構造化バインディングは多値返す関数の使う側が楽になる
mapのループ記述も楽

1013 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 11:16:27 ID:X1Z5LMNW.net]
>>981
お前いつもの煽るしか能のないアホだろw
いいから>>973に答えられる範囲で答えてやれよ

1014 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 11:18:07 ID:X1Z5LMNW.net]
ていうかプロを騙って何か良い事でもあんのかね
よっぼどアマチュアであることに強いコンプがあるんだろうな

1015 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 11:36:20 ID:8Z2Ww5c+.net]
最新の言語機能使う俺すげー

大人になろうぜおっさん

1016 名前:843 mailto:sage [2020/05/14(Thu) 11:46:09 ID:X6Fr6WNg.net]
そもそも>>967が言うありがたい機能って>>969が言う自前で実装してた機能を自分で実装しなくて済むとかより楽に綺麗に書けるってものでしょ
なので>>969のツッコミが意味不明
単に標準化がおせーよって言いたいだけ?



1017 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 11:47:37 ID:4xm+WE1I.net]
03至上主義もどうかと思うけどな
unique_ptrくらい使った方がコード品質も上がるよ

1018 名前:デフォルトの名無しさん [2020/05/14(Thu) 11:48:08 ID:tvxDWcUo.net]
次スレよろ

1019 名前:843 mailto:sage [2020/05/14(Thu) 11:49:30 ID:dNlWUJhr.net]
中身は子供の使える俺すげー君もうざいけど使えないことを言い訳する>>986みたいな老害もそれ以上にうざいわ

1020 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 11:52:25 ID:nTyJBG5I.net]
constでRAIIちゃんとやろうとしたら構造化バインディングはありがたいのだが

1021 名前:デフォルトの名無しさん mailto:sage [2020/05/14(木) 11:54:33.42 ID:aX0QHk6r.net]
>>989
とりあえず建てといた
C++相談室 part151
https://mevius.5ch.net/test/read.cgi/tech/1589424805/

1022 名前:デフォルトの名無しさん mailto:sage [2020/05/14(木) 12:19:53.50 ID:Qhhsb9+b.net]
技術職の不勉強は罪だと言っている
居直るやつはクズの中のクズだ

1023 名前:デフォルトの名無しさん mailto:sage [2020/05/14(木) 13:09:18.91 ID:8Z2Ww5c+.net]
言語の文法の勉強なんで優先度低い
多くの場合大してソフトウェアの品質上がらない
(そもそも定量化できていない、可読性とかいうあいまいな個人の感想だけ)
そんなもんは枯れたころに導入すれば十分

1024 名前:デフォルトの名無しさん mailto:sage [2020/05/14(木) 13:12:11.41 ID:8Z2Ww5c+.net]
↑は仕事で使う場合の話ね
趣味の人はご自由に
実際おれだって個人開発では17使ってる

1025 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 14:19:57 ID:Qhhsb9+b.net]
優先度って、まるで他の勉強に忙しいような言い方だな
こんなところで下らない言い訳ばかりしてるやつが

1026 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 15:23:11 ID:X1Z5LMNW.net]
いいからC++スゲー=俺スゲーしたいだけの馬鹿は黙ってろ



1027 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 15:28:43 ID:8Z2Ww5c+.net]
そうだね、忙しいね
computer vision系やってるから日々数学の勉強でいっぱいいっぱいだよ
c++の学習は特に頭いらないから週末気分転換にちょっとやる感じ
構造化バインディング使ったところで、認識エラーは1ミリも下がらない

1028 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 15:29:06 ID:x0qWbzDY.net]
根性で五万行組み上げたみたいなバカコードは嫌い
そんなのは女にもモテない
もっとスマートにこなすべき

1029 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 15:46:10 ID:Qhhsb9+b.net]
見え透いた嘘ぬかすな
週末気分転換にちょっとやってりゃ
未だにC++03にしがみついているわけがない
もし本当にそうならC++には絶望的に向かないバカだ

1030 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 15:47:05 ID:Qhhsb9+b.net]
C++11から何年経ったと思ってるんだ
週末は年に52回もあるんだぞ

1031 名前:デフォルトの名無しさん mailto:sage [2020/05/14(Thu) 15:51:59 ID:X1Z5LMNW.net]
ん?
>未だにC++03にしがみついているわけがない
>>995で17使ってると言ってたようだが

てかもうちょい生産的な話出来んのか
仕事でも趣味でも都合の良いコンパイラ使えばいいだけの話
構造化束縛をマクロとテンプレートで実現するとかなら面白い話題なんだけどな(面白いだけで実用性があるとは言ってない

1032 名前:1001 [Over 1000 Thread .net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 51日 15時間 47分 26秒

1033 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<257KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef