X



C++相談室 part144

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2019/07/22(月) 13:18:35.52ID:gptRHpgT
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part143
https://mevius.5ch.net/test/read.cgi/tech/1560574313/

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

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

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

----- テンプレ ここまで -----
0584デフォルトの名無しさん
垢版 |
2019/08/20(火) 17:25:38.94ID:lOKfo+mN
>>580
アセンブリコードを見る限り、特に問題なく、人間が単純に書いた場合
と似たようなコードになっています。

ただし、一点、テーブルの c 番目の要素を参照する際、バイト整数の c
をゼロ拡張して32BIT 整数にする必要があるのですが、自分の使ってるVC++
だと、movzx 命令を使わずに、xor eax,eax; mov al,cl のように2命令
を使ってしまっている点が、人間が最適化するより遅いコードになってしまって
います。
0585554
垢版 |
2019/08/20(火) 18:34:23.13ID:4t2XBONQ
コメントありがとうございます。

>>555
エンディアンを気にしないといけないのは後々分かりづらくなりそうですね。。

memcmpというのがあったんですね。
連続バイト比較ができてシンプルで良さそうです。
これを使ってみます。
0586デフォルトの名無しさん
垢版 |
2019/08/20(火) 19:55:32.24ID:otgnf5aI
volatile命令の他にキャッシュ命令とか無いのかよ
ルックアップテーブルをキャッシュに載せときゃ爆速じゃん
もっと言えばテーブルを石に焼いた時一番早い
0587デフォルトの名無しさん
垢版 |
2019/08/20(火) 22:55:27.89ID:C94+kmpU
>>569
>分岐予測はデータの内容関係ないやろ
分 岐 予 測 は デ ー タ の 内 容 (統計的偏り) に 関 係 あ る

>>567
最近のCPUは黒魔術で製造されているからミクロな最適化を下手に人が手を加えるより
単純なアルゴリズムにした方が速いことが多くなた
印象
0589デフォルトの名無しさん
垢版 |
2019/08/21(水) 01:15:10.83ID:X4j3osk/
多分メモリが読めてない状態でも分岐予測して投機的実行はするんじゃないかな
近代的なCPUは
0590デフォルトの名無しさん
垢版 |
2019/08/21(水) 05:42:53.52ID:Vc3YPkYv
>>567の前半部のコード
>if ( (c >= 'A' && code <='Z') || (c >= 'a' && code <='z') ||
>  c == '_' ) {
> ・・・
>}
はCPUレベルの分岐予測+投機的実行では入力データによっては速度向上し難いケースがある
 AaZz_AaZz_AaZz_....
という入力を考えたらワカル(cといして1文字入力される度に||か&&を打ち切る分岐箇所がちがーう
分岐予測キャッシュというのは分岐命令1個につき1状態か2状態記憶がせいぜい(しかもLRU式に記憶が消える
のでこのような場合は投機的実行結果が捨てられ続けかねない

>>598
ハイ論破

>>589
分岐予測と投機的実行が効力を発揮するのは多重ループで内側の分岐条件が大部分の時間変わらないというケース
0591デフォルトの名無しさん
垢版 |
2019/08/21(水) 05:59:08.65ID:Vc3YPkYv
ちゅか&&や||の条件式に関数呼び出しが含まれない単純なケースにおいては、
OoOと分岐予測を備えた今日日のCPUでは途中で打ち切るより全部評価してしまった砲が速い可能性がおおきい
このとき問題になるのは副作用のある式が問題であり、
副作用がある++や--があると、やっぱ言語規格どおり||や&&は条件成立で打ち切らないとソースコードに書かれた気体動作と
オブジェクトコードの動作が別物になってしまうので諸悪の根源
C言語を引きずった仕様のままでは時代について逝けてない

Rustで++や--を式の中で使えないのは故無きことでは無いんじゃ…
0594デフォルトの名無しさん
垢版 |
2019/08/21(水) 07:20:20.39ID:6njIT3pF
>>590
> (しかもLRU式に記憶が消える
知ったか乙
せめて
https://ja.m.wikipedia.org/wiki/分岐予測
くらいは読んでこい

> のでこのような場合は投機的実行結果が捨てられ続けかねない
そりゃ頑張って作れば最悪の状況は作れるよw
だから何?って話だが
0595デフォルトの名無しさん
垢版 |
2019/08/21(水) 10:08:42.06ID:yoKe7uXb
>>590
そういう安価ミスはちゃんと訂正しろよ
あと反論になってない
語弊はあったろうけど配列だから分岐予測が効かないなんて話はないだろうと言いたかっただけだ
0596デフォルトの名無しさん
垢版 |
2019/08/21(水) 20:40:17.99ID:fYY/XStv
>>586
1バイトの即値データとの比較の方が速いに決まってんだろ。
命令デコードする段階で比較対象のデータとってこれるんだから
0597デフォルトの名無しさん
垢版 |
2019/08/21(水) 22:54:56.30ID:Vc3YPkYv
>>594
リンク先のどこにLRUでは無いと書いてあるんじゃ…
分岐予測キャッシュがあふれたときはLRUが基本
これは2次キャッシュを儲けても関係ない(それぞれの中で溢れたらLRU
むしろハードウェア実装の制限でLRUより性能の落ちるしくみを使うこともある
が(nウェイセットアソシアティブの「アソシアティブ」部分は一部アドレス線の固定解釈による簡素化

>>595
分岐予測が性能を発揮しない例が有る以上ハイ論破の訂正の必要は認められぬ
0598デフォルトの名無しさん
垢版 |
2019/08/21(水) 23:02:56.86ID:Vc3YPkYv
もし分岐予測制度を上げるためのキャッシュエントリのn状態化とキャッシュが溢れた場合の話を
混同しているんだとしたらきわめておめでたい話だといえる

あるアドレスの分岐命令に対応するキャッシュエントリがどの状態に居たとしても、
そんあことはお構いなしに溢れたときはどれかのエントリが消される.。
このとき他の制約が無ければ理想解はLRUという話
0599デフォルトの名無しさん
垢版 |
2019/08/21(水) 23:16:22.08ID:Vc3YPkYv
ていうか
>1状態か2状態記憶がせいぜい(しかもLRU式に記憶が消える (>>590
とまで書いたのだからキャッシュエントリのn状態化は機知の前提で話していることぐらいは読み取って
ホスイ
(雑駁なリンク先を示すよりはむしろ「1状態って何だよ2状態だろパーカwwwwwww」ぐらいの反応であれば>>594は知性を疑われずに済んだ
0600デフォルトの名無しさん
垢版 |
2019/08/21(水) 23:18:51.67ID:yoKe7uXb
ただのこじつけじゃねーか
てかそんだけ御託並べて質問者へのアドバイスはゼロかw

(というかこいつの論調どっかで見たな・・・)
0601デフォルトの名無しさん
垢版 |
2019/08/22(木) 00:05:50.83ID:F37ex36A
>>597-599
分岐予測はキャッシュじゃねーぞw
反論するなら分岐予測にLRUアルゴリズムを使ってる奴はCPU挙げてみな
0602デフォルトの名無しさん
垢版 |
2019/08/22(木) 10:59:48.20ID:36M5lMYO
いや、まてまて、そもそも今の話は、分岐予測の精度は関係無いのでは?

>「配列は読み出してみないと値がわからないので、予測が出来ず」

がおかしいって話でしょ
精度はともかく、分岐予測はするでしょ
というか、逆に、値が分からないから分岐予測するようなもので

分岐予測の精度に関しても、if文のかっこの中の計算が終わってない状態で
適当にジャンプするのは同じでしょ、配列が読めてようが読めてなかろうが
0603デフォルトの名無しさん
垢版 |
2019/08/22(木) 11:58:47.76ID:Vlc++9B2
そりゃー予測なんかせず配列まるまる全部をキャッシュに乗せるから早いんだろ
つまり予測しないルックアップテーブルの時が一番早い
そのテーブルがCPUに焼きこんであればもっと早い
0604デフォルトの名無しさん
垢版 |
2019/08/22(木) 13:09:16.96ID:36M5lMYO
いやだから、ルックアップテーブルの結果を受けて分岐する話なんだから・・
おかしなこと言うな
0606デフォルトの名無しさん
垢版 |
2019/08/22(木) 15:51:21.48ID:eMNxtHht
多くのCコンパイラがサポートしてるquadmath (__int128とか__float128とかその関数)がかなり便利なのですが、なぜこれはC++の標準の機能にならなかったのですか?
0607デフォルトの名無しさん
垢版 |
2019/08/22(木) 18:02:39.65ID:/5icwwgo
殆んどのハードでの実装がソフトで遅いし、需要も少ない
使いたきゃboostにあるし

標準化されるとしたら、x86とかでハード実装された後に標準型として対応するんじゃね?
てかlong doubleがワケわからんことになっているのをどうにかしろと
0608デフォルトの名無しさん
垢版 |
2019/08/22(木) 18:28:45.94ID:6PHJNtSf
'A' から 'Z と 'a'から'z' は連続した文字コードである
ここにcpuの速度の秘密がある はず
0610デフォルトの名無しさん
垢版 |
2019/08/22(木) 20:52:16.00ID:KKaRKvsP
>>606
大型計算機にすら倍々精度をハードウェアで扱ってないもんな
命令体系は用意されてるけど
ソフトで十分ってこった
0619デフォルトの名無しさん
垢版 |
2019/08/22(木) 22:59:39.88ID:ywV62E2Z
そういう話じゃない。
金融計算では10進数のどの桁でどういう丸めを行うか決まっているから、
その通りの結果になることが「誤差がない」状態なんだよ。
0621デフォルトの名無しさん
垢版 |
2019/08/23(金) 00:16:10.19ID:/B94cENN
>>611
畳み込み和の計算はフーリエ変換して求めておいて最後に逆変換することで高速化できます (畳み込み定理) が、しばしば誤差の増大がネックになります
こういう問題で出てくる整数はとても大きいということもあります
だから巨大な数を普通に扱いたいのです

数論変換 (整数環上でのDFT) をすれば良いのですが、もっと単純化できないかという試行錯誤です
0622デフォルトの名無しさん
垢版 |
2019/08/23(金) 00:39:49.78ID:CmTDylN7
蒸し返すようですいませんがGNU Makeに取って代わるデファクトスタンダードなビルドシステムってCMakeじゃないんですかね
0624デフォルトの名無しさん
垢版 |
2019/08/23(金) 21:07:50.69ID:1CEPBqe0
>>622
取って代わるというかmakefileをつくるメタビルドツールって方が認識として正しい。
実際cmakeでwindowsでもlinuxでもビルドできるように設定するのはマジ辛いぞ。
0625◆QZaw55cn4c
垢版 |
2019/08/23(金) 21:29:52.90ID:NZyGR+Pl
>>624
そういうのは windows 用と linux 用にわけるんじゃないでしょうか?
0626デフォルトの名無しさん
垢版 |
2019/08/23(金) 21:30:32.32ID:9XBmxzHo
CMakeもAutoconfなんかと比べたら簡単になったんだろうけど、自分で書くならgypだな。
0629デフォルトの名無しさん
垢版 |
2019/08/23(金) 23:21:07.68ID:LHN2h0YB
automake/autoconfに慣れたからcmakeいらんわ
うまくクロス環境みつけてくれないこと多いし
0630デフォルトの名無しさん
垢版 |
2019/08/24(土) 09:02:17.39ID:u6taJwr5
>>625
cmakeとかautomake系のツールのコンセプトはできるだけ分けないで書けるように
ってところではあるが、まあ実際はそれぞれの環境用に色々やるのと大して変わらん。
少なくともデバッグするときはその環境毎のビルドがわかってないとほぼ詰むし。
なんだかんだでまずlinux系統でmakeになれるのが近道だとは思うけどね。
あれでヘッダー依存の取り扱いがしっかり書けるようになれば大抵のビルドシステムにも慣れるだろう。
0631デフォルトの名無しさん
垢版 |
2019/08/24(土) 09:18:12.19ID:+PLwcW2w
最終的にクロスプラットフォームでちゃんとやれることを目指すならmakeもmsbuildも
両方押さえておかなければならないわけで、どっちが先ってことはないと思うがな。
0634デフォルトの名無しさん
垢版 |
2019/08/24(土) 22:40:38.50ID:+PLwcW2w
- >>630>>632に話の脈絡が全くない
- >>632 べつに楽な方から始めるのが良いという根拠もない
- というか>>630はmakeがわかれば他はもっと楽だという、逆のニュアンスだったんじゃないの?
- そもそもmsbuildの情報もMSDNで簡単に調べられるし

ツッコミどころ多すぎ。

>あれでヘッダー依存の取り扱いがしっかり書けるようになれば

いまどきlinuxでもそんなん手書きする奴はいないw
0635デフォルトの名無しさん
垢版 |
2019/08/25(日) 12:27:30.33ID:haXU+hCF
makeじゃなくてmsbuild教える方がいいと思うならお前はそうしろ。
それが本当にいいと思ってんならな。
俺だったらmakeを教えるというだけの話だ。
0636デフォルトの名無しさん
垢版 |
2019/08/25(日) 14:08:01.24ID:Nf3A65/V
また支離滅裂なw
makeとmsbuildの優劣なんて話はしてないんだが、日本語不自由なのか?

>少なくともデバッグするときはその環境毎のビルドがわかってないとほぼ詰むし。

という理由でmakeを覚えなければならないと主張するなら、同じ理由でwindows環境向けには
msbuildを覚えておかなければ片手落ちだろうと指摘しただけ。

まぁどうせ上の理由も後付けで、cmakeを知らない爺が横からmakeを布教しようとしただけなんだろうが。
0638デフォルトの名無しさん
垢版 |
2019/08/25(日) 15:51:39.75ID:hTkFprTS
手で触るもんじゃないけど
一度手で触っておかないと吐き出されたmakefileを見て何がおかしいか理解できない
0639デフォルトの名無しさん
垢版 |
2019/08/26(月) 11:17:55.70ID:mep62E1y
std::condition_variableを使って複数のスレッドが待ち状態の時、
notify_oneで一つだけスレッドロック解除した場合、解除されるスレッドに優先度はある?
例えば、一番最初に待ち状態に入ったスレッドのロックが解除されるとか。
それとも完全に実装依存?
0640デフォルトの名無しさん
垢版 |
2019/08/26(月) 16:25:41.54ID:yDrui9+d
notify_one使ったことないけど解説読む限り実装依存に見える(待機中のスレッドからいずれか一つ、とかあるし)
順序あるならそう書かれると思う
曖昧ですまんけど
0642デフォルトの名無しさん
垢版 |
2019/08/26(月) 20:31:47.24ID:bJVhcqWX
俺は多分カーネルのスレッドのスケジューリングで
たまたま選ばれたやつが走ると思う
しらんけど
0643デフォルトの名無しさん
垢版 |
2019/08/26(月) 22:58:04.80ID:ZsUTwn4r
流れ読まずに申し訳ございません、質問させてください。

非エンジニアのものなのですが、下記のようなオープンソースのコードを使って
メッセージのウェブアプリケーションを創ってみたいのですが、
一番手っ取り早い方法はどういう方法でしょうか?

漠然とした質問で申し訳ございません

▶Telegram
https://telegram.org/apps#source-code
▶Signal
https://github.com/signalapp
▶Rocket Chat
https://github.com/RocketChat/Rocket.Chat
▶Tox
https://github.com/Tox/tox.chat
▶Wire
https://github.com/wireapp/wire
0645デフォルトの名無しさん
垢版 |
2019/08/26(月) 23:21:58.15ID:h9DDya56
>>636
お前ほんとにmsbuildいじったことあるのか?
あんなクソなものを本気で使ってんの?
てかヘッダ依存解決くらい書けなきゃまともなビルドシステムなんて絶対組めねーよ。
こういう誤誘導を平気でするやつってどういう神経してんだろうな。。
0647デフォルトの名無しさん
垢版 |
2019/08/27(火) 00:16:27.36ID:tgTbqYO8
最近C++を学び始めたのですが、
テンプレート引数の型をコンパイル時に文字列に変換する方法ってあるのでしょうか?

できればテンプレートの特殊化やプリプロセス命令を使わずに以下の用な感じでかければよいのですが

template<typename Type>
class Hoge
{
public:
static constexpr char* Text = Typeを文字列に変換して納入したい
};
0648デフォルトの名無しさん
垢版 |
2019/08/27(火) 00:31:42.36ID:EWBBAhUG
無理ゲー
あくまで自動にこだわるならtypeid使え。
自作クラスだけならクラス名を名乗るメンバ関数でも作っとけ
0650デフォルトの名無しさん
垢版 |
2019/08/27(火) 08:26:10.70ID:CO6EoWnq
>てかヘッダ依存解決くらい書けなきゃまともなビルドシステムなんて絶対組めねーよ。

いつの時代から来たんだよw
ソースに #include 書く度にいちいちMakefile書き換えんのか?
0652デフォルトの名無しさん
垢版 |
2019/08/27(火) 17:31:34.79ID:icKeAJ7/
>>649
以前nameofとかいうライブラリ?が同じくgithubにあったけどどっちが便利かな
というかこの手のは他にもあるっぽいな

>>651
いや合ってると思うけど
ウェブなのかネイティブなのか、多分ごっちゃになってるだろうからまずそこを指摘すべき
0653デフォルトの名無しさん
垢版 |
2019/08/27(火) 18:46:31.35ID:idJxRw9J
別にウェブだからって既存のブラウザ上で動くものという定義はあるまい
サーバーサイドもクライアントサイドも両方C++で作ればいい
そもそもブラウザだってC++で作られているんだから
0656デフォルトの名無しさん
垢版 |
2019/08/28(水) 08:42:46.33ID:4Zzob7TG
>>650
書き換えなくていいように書けるようにするってことだよバカ。
てか依存をしっかり見るって意味じゃヘッダを意識するってのは
相当大事なんだがな。
タスク管理を意識した場合、どんなレイヤーで仕事する場合でも重要になる。
0657デフォルトの名無しさん
垢版 |
2019/08/28(水) 08:50:01.49ID:4Zzob7TG
てか想像以上にビルド周りの技術ってc+11から入った輩は理解してないのな。。
またクソシステムの再生産が10年単位で続きそうだわ。。
0658デフォルトの名無しさん
垢版 |
2019/08/28(水) 10:10:28.35ID:mAC2Cq6c
そりゃこのスレでも
「閃いた!stdを usingすれば文字を打つのが少なくなるよ!」って宣う輩がいるくらいだし
0659デフォルトの名無しさん
垢版 |
2019/08/28(水) 10:16:52.21ID:FUc/M6fg
趣味でc++のパズルにはまってる人と
仕事で生産的に使いたい人とでは
言語に期待するものが違うからね
区別しないと
0660デフォルトの名無しさん
垢版 |
2019/08/28(水) 10:25:14.14ID:4pdYY7R1
このビルド周りのクソ仕様のせいで年々インタプリタ型に人が流れていくんだわ
0663デフォルトの名無しさん
垢版 |
2019/08/28(水) 14:10:32.76ID:DpQqY3bZ
そのうちC++ライブラリ用リポジトリとかC++用パッケージマネージャとか作りはじめそう
0664デフォルトの名無しさん
垢版 |
2019/08/28(水) 15:22:40.67ID:A/ckRNOE
車輪の再発明が好きなやつが多すぎてウンザリする
道具ばっか作ってどうすんだ
道具つかって絵描いたり家建築したりするのが仕事なのに
0666デフォルトの名無しさん
垢版 |
2019/08/28(水) 18:52:20.58ID:r3MNaUf0
makefileなんて十数年触ってないしもう忘れたけど
>>656-657には同意するわ
依存関係も考えた上で設計&利用しないとコンパイル時間の増大とかに全く対処できなくなる
新しい機能には飛びつくわりに古い部分(しかも無くなってるわけではない)をおざなりにするのはあかん
0668デフォルトの名無しさん
垢版 |
2019/08/28(水) 20:42:39.92ID:G5Ue/9b7
>>656
これ、依存関係を自分で書くんじゃなくて gcc -M とかで自動的に判断させることを言っているんだろうか?
msbuildを含めて今どきの大抵のビルドシステムでできることなんだが。
0669デフォルトの名無しさん
垢版 |
2019/08/28(水) 20:46:54.49ID:W4Wf3gf+
>>649
こんな良いライブラリーがあるんですね。
非常に助かりました。ありがとうございます!
0670デフォルトの名無しさん
垢版 |
2019/08/28(水) 20:59:56.83ID:4Zzob7TG
>>668
makeが実装が一番ネイティブでわかりやすいってことだよ。
bazelなんか中身はもろにmakeだろありゃ。
ただはじめからbazel使ってたらエラーメッセージ見てもわからんだろうし、
そういうのをはじめに薦める奴は詐欺だろ。
0671デフォルトの名無しさん
垢版 |
2019/08/28(水) 22:02:26.02ID:ieioKQ06
makeがネイティブ?わかりやすい?冗談だろ
暗黙ルールとか特殊変数とか特別扱いのターゲットとかやめろ
アーカイブだの何だのを勝手に推定しておせっかいな処理挟み込むのを全部やめろ
積もり積もったウンコの山を無効にさせろ
0674デフォルトの名無しさん
垢版 |
2019/08/28(水) 22:33:45.39ID:4Zzob7TG
>暗黙ルールとか特殊変数とか特別扱いのターゲットとかやめろ
まあこれはわかる。

>アーカイブだの何だのを勝手に推定しておせっかいな処理挟み込むのを全部やめろ
これは逆に暗黙のルールを使ってるからだろ。

基本的に明示的なmakefileを書いてないのが原因だが、
こんなこと言い出したら他のビルドツールなんて使えんぞ。。
vc compilerなんかもっと暗黙の設定まみれだわ。
0675デフォルトの名無しさん
垢版 |
2019/08/28(水) 23:47:07.56ID:atkmfnSl
マルチプラットフォームで使えて、固定小数点を扱えるOSSっていいのないかな?
0679デフォルトの名無しさん
垢版 |
2019/08/29(木) 21:47:21.89ID:81mive3+
使われていないクラスのstaticメンバ変数って生成されないのでしょうか?
0681デフォルトの名無しさん
垢版 |
2019/08/29(木) 23:00:42.76ID:KkrIMV0W
>>679
多分生成される可能性が高いね
何故ならC++にはコンストラクタがあるから
つまりはstatic変数のコンストラクタで何かしているかもしれないだろう
だからリンカの最適化は削除をしないだろうね
ただ、普通のintとかだとリンカの最適化で削除されるかもしれないけど
まぁ運しだい
ともかく、規格では多分決まってない
0682デフォルトの名無しさん
垢版 |
2019/08/29(木) 23:20:08.64ID:xxmh5CSn
>>679
そのstaticメンバの定義を消してコンパイルしてもエラーにならなければ生成されてない
ちなみにstatic constとかの変数は元々ほとんどのケースで生成されてない
■ このスレッドは過去ログ倉庫に格納されています

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