C++相談室 part153

■ このスレッドは過去ログ倉庫に格納されています
2020/10/10(土) 23:18:20.00ID:i4F+i14Y
https://mevius.5ch.net/test/read.cgi/tech/1589424805/
※前スレ
C++相談室 part152
https://mevius.5ch.net/test/read.cgi/tech/1594528940/

テンプレおしまい
2020/12/18(金) 23:29:15.18ID:zfI8p5qO
プログラマがうんちく言わないで何やるんだ?
768デフォルトの名無しさん
垢版 |
2020/12/18(金) 23:48:52.19ID:A9pQAhpY
これの話の続きなのか
なら不思議は解消だ
謎は全部解けた


C++相談室 part151
https://mevius.5ch.net/test/read.cgi/tech/1589424805/20

20 名前:デフォルトの名無しさん[sage] 投稿日:2020/05/14(木) 18:32:35.87 ID:jF4/VTtK
>>17
ggrks
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf

あとcppreferenceはある意味ファンサイトみたいなものなので、何らかの標準化組織の公式サイトというわけじゃないよ
769デフォルトの名無しさん
垢版 |
2020/12/19(土) 00:02:31.33ID:yZxXMpJa
そんな昔のスレは関係ないのでは?
2020/12/19(土) 00:20:03.02ID:0cb9HLXb
>>766
こういうとこでの情報提供や議論はともかく、うんちくでマウント取りたがるのは自信の無さの裏返しだからねぇ
2020/12/19(土) 00:23:06.73ID:sq702jvD
うんちくがうっとおしくて、仕事なら自分が勝ってる!って思い込みたいだけなんじゃないの
772デフォルトの名無しさん
垢版 |
2020/12/19(土) 00:26:01.61ID:yZxXMpJa
図星つかれたからうんちくと言ってるのでは?
2020/12/19(土) 00:38:15.56ID:x1EY5aRu
スカトロスレ
2020/12/19(土) 00:42:57.09ID:0cb9HLXb
爆釣ww
775デフォルトの名無しさん
垢版 |
2020/12/19(土) 03:34:46.64ID:yZxXMpJa
この野郎。
ウンチクンめ。
2020/12/19(土) 06:01:48.82ID:u3YcA1fK
>>765
だから何?
俺がどのドラフトをDLするかを
いちいちあんたの承認とらにゃいかんの?
こっちゃ不思議がられても関係ないんで
いちいち申告してもらわなくていい
2020/12/19(土) 08:07:11.10ID:vl/1bKki
まあお茶でも飲んでカルシウム取ろう
2020/12/19(土) 10:17:03.91ID:M1Nera9i
お茶にはカルシウム入ってないだろほとんど
2020/12/19(土) 10:18:39.16ID:dTYT78ol
お茶とカルシウム入りウェハースでも食えばええやん
2020/12/19(土) 10:25:15.46ID:cik2rIYa
何のはなしやねん
2020/12/19(土) 13:23:01.76ID:biviwPkb
Ca++
2020/12/19(土) 13:26:14.15ID:biviwPkb
正式版は有料だがドラフトはタダで手に入るからヒジョーに得がたいが、
やっぱドラフトの内容は随時変わるから、
居丈高に相手を論破してなじり倒すにはやっぱ最新のドラフトでないとイマイチ、
2020/12/19(土) 13:50:09.89ID:B7wez7Ce
よくわかりませんが、Chromeで実装されてるお試し機能がSafariで実装されてないからSafariはクソというのと似た話ですか?
2020/12/19(土) 14:02:30.06ID:biviwPkb
Chromeで実装されてるお試し機能がSafariで実装されてないからSafariはクソとなじったら
ドラフトの版が変わったらChromeの方がクソだった、みたいな
2020/12/19(土) 14:41:50.09ID:+cK8B71a
ゴミみたいなやり合いだな
くだらな
建設的な議論ができんのか
2020/12/19(土) 18:35:13.01ID:dM4VNuuI
C++のプロジェクトに始めて関わって既存コード眺めてたんだけど、関数やメソッドを呼び出す時って、呼び出す側が結果を格納する箱となる変数とかポインタを渡して、
メソッドや関数は成功失敗のint値をreturnする書き方しているんだけど、
これってC++の書き方なの?
2020/12/19(土) 18:41:15.86ID:5blMWj9s
>>786
まあその方がメモリ管理をミスを防ぎやすいからな
C++11以降だとまた世界が違うが
2020/12/19(土) 18:42:49.16ID:x1EY5aRu
どう世界が違うの?
いじわるしないで教えてよ
2020/12/19(土) 18:46:00.09ID:dM4VNuuI
メモリ管理の文化的な作法なのね。
2020/12/19(土) 18:47:02.46ID:5blMWj9s
>>788
スマートポインタが実用になったから、それでメモリ管理する方が文字通りスマートになった
だから、必要なら関数内部でメモリ確保する方法でもメモリ管理ミスが起こりにくい
2020/12/19(土) 19:25:11.20ID:p4OhEmVF
>>786
c++というかcの伝統だわな。
オブジェクトをヒープに置かなくていいという性能的なメリットもある。
2020/12/19(土) 19:59:05.03ID:HGWooSzm
Cだと不定長の配列やら文字列やら返す関数ひとつ作るだけで大事件だからなぁ
「いいですかー!この関数が返す配列はヒープ確保したものですよー!使い終わったらXXX__free()で解放してくださいよー!
解放忘れたらリークしますよー!!!絶対に最後に解放してくださいよー!忘れないでねー!絶っっっっっっ対に忘れないでねー!!!」
ってコメントやドキュメントやサンプルコードにしつこくしつこくしつこく書いて書いて書いて徹底的に注意喚起しないといけない
そして当然のように忘れられて「分かりにくい関数作りやがって」って叩かれる所までがお約束

vectorやstringをゴロッと返せば済む今はいい時代になったと思う
2020/12/19(土) 20:17:48.73ID:vl/1bKki
消費者が買い物袋用意するなんてレジ袋有料化みたいだな
794デフォルトの名無しさん
垢版 |
2020/12/19(土) 20:19:43.48ID:yZxXMpJa
右辺値参照のおかげですよ。
795デフォルトの名無しさん
垢版 |
2020/12/19(土) 21:06:02.20ID:ISt3uDJM
質問@:
例えば…std::vectorで配列を確保したとします…push_backで追加した時に…アロケーター??が…
アドレスの再割当てをしたとします…この時…vectorは要素のアドレスは連続である事は保証されますが…
この時のアドレスの再割当てって…同期?非同期?どうなるの?
つまり…push_back時に同期で行うのか…非同期でロジック流れて行っちゃうか…って所…。
非同期だと怖いんだけど…。

質問A:
std::vector<char>とやった場合…data()でchar*を取れますが…std::vector<char>に'\0'の概念って
あります?どうなんでしょうねぇ…。'\0'のために+1多めに確保するなんて事はしないと思いますが…
どうなん?内部でどうなってるのかは…解りません…。
2020/12/19(土) 21:33:09.17ID:HGWooSzm
普通に質問しろ
797デフォルトの名無しさん
垢版 |
2020/12/19(土) 22:28:27.67ID:yZxXMpJa
>>795
アロケータの内部実装がどうなっていようとも、push_back()から戻った時にはデータは追加されているので、問題ないのでは?

std::vectorは末尾に0を追加したりしません。
2020/12/19(土) 22:39:50.71ID:u3YcA1fK
>>782
- 最新のドラフト
+ 正式版の規格票
2020/12/19(土) 22:59:41.56ID:vl/1bKki
確かにCだと必要メモリの問い合わせの為に二度呼び出したり面倒でしたわ…
2020/12/19(土) 23:18:45.05ID:biviwPkb
>>798
正式版の規格票は金かかるやんけヽ(`Д´)ノ
2020/12/19(土) 23:20:05.98ID:biviwPkb
>std::vectorは末尾に0を追加したりしません。
左様いまだにstd::string::c_str()が内部で何をやっているのかわからん…
2020/12/20(日) 00:32:15.85ID:zH6cQZTj
誰もstringの話してないと思うが
2020/12/20(日) 07:06:06.65ID:u5Xjtcw/
>>801
msys64/mingw64/include/c++/10.2.0/bits/basic_string.h
ここに書いてあるぞ
2020/12/20(日) 09:47:23.01ID:C7ljP8CG
>>799
でも「直接メモリいじってる」て感覚があって好みだったなぁ
まあ自己満足でしかないのだけれど
2020/12/20(日) 10:51:49.27ID:KSHt8d36
今どきのC++(C++11以降)だと基本的にスコープ抜けたら開放される方式で実装するものなの?
なるべくnewせずにスタック変数にする or ヒープ確保するにしてもスマートポインタ使う
とかで
2020/12/20(日) 11:14:31.35ID:IFRd5RXQ
>>805
そうしたほうが簡単だから、C++11とか関係無くそうするだろ。
2020/12/20(日) 11:16:20.77ID:B3eFXD1J
RAIIなんて今どきでもないだろ
2020/12/20(日) 11:27:39.08ID:KSHt8d36
そうかな?
ライブラリとかでわざわざInitialize/Finalizeとか明示的に呼ばなきゃいけないの
結構ある気がするけど
2020/12/20(日) 11:52:43.58ID:mkiVvOjR
Finalizeが失敗する可能性があってエラーハンドリングしないといけない場合はあえてそうしているかもね
810デフォルトの名無しさん
垢版 |
2020/12/20(日) 13:25:24.04ID:8M1CEzDz
あえてね!
2020/12/20(日) 13:31:53.40ID:1w6q/2mK
というかスコープ内で完結しない、グローバルな状態を持つものならそうするやろ
2020/12/20(日) 13:48:55.12ID:KSHt8d36
グローバルバカかな?
2020/12/20(日) 13:52:50.85ID:BqPIIXKk
お前が挙げてたそういうライブラリがInitialize/Finalizeの中で何やってるか考えれば自ずと答えはでるだろ
2020/12/20(日) 14:05:47.98ID:S1Ae4PMu
グローバルな初期化と後始末ならInitialize/Finalizeとか明示的に呼ぶ設計のが一番闇が少ない
ファクトリメソッドでオブジェクトを作ることにして、ファクトリ元オブジェクトの
コンストラクタとデストラクタでそれぞれInitializeとFinalizeでも良いが(呼び忘れ対策は完璧になるが
InitializeやFinalize自体のエラーハンドリングを考えるとやっぱビミョー
2020/12/20(日) 21:00:32.48ID:POdM0+je
変数名で対象変数のポインタを取得してくる実装(リフレクション?)をしたいんですけど
対象変数をポインタテーブルとかに書き下すことなくコンパイル時に変数名リテラルと対応するポインタを自動生成することってできますか?
2020/12/20(日) 21:02:59.13ID:POdM0+je
対象変数はstructかclassのメンバ変数を想定しています
2020/12/20(日) 21:23:18.64ID:B3eFXD1J
直接には無理
目的次第だけど基本的にはプリプロ駆使して頑張るしかない
2020/12/20(日) 22:39:57.26ID:pIq+bOjP
まずC#処理系を書きます
2020/12/20(日) 22:49:36.29ID:ZSjgwNod
車輪がでかすぎる
2020/12/20(日) 23:37:12.93ID:XnWb8UXr
マップファイルから生成
821デフォルトの名無しさん
垢版 |
2020/12/21(月) 02:47:40.73ID:HVkDagg+
数値計算に興味がある方に聞きたいのですが、ベクトル演算はどのように実行していますか?
valarrayかeigenなのか、vectorでforを回すのか…C++の常識ではどうやるのか伺いたいです
2020/12/21(月) 03:43:19.44ID:tQs5NvLs
>>821
blasやlapackにルーチンがあるならそれを使う(ラッパーを作る)
要素の持ち方はvectorでもvalarrayでもその他クラスでも、一次元的にメモリに格納されるなら何でも良い
二次元以上の配列が行優先か列優先かさえ固定しておけば何でも良い
2020/12/21(月) 12:49:04.92ID:h5UrY03S
>>821
時と場合による
2020/12/21(月) 12:49:33.35ID:h5UrY03S
ベクトル演算
ていうだけじゃ広すぎて
2020/12/21(月) 12:52:20.80ID:XzTX0Cyb
SVDとかするなら自前実装なんか無駄だからeigen使う。それ以外なら>>822 の通りだな。
826デフォルトの名無しさん
垢版 |
2020/12/21(月) 19:14:50.06ID:5SN4/ItM
みなさんありがとうございます
主に多次元の常微分方程式を解く目的でFortranからc++へ移行しようと考えていたのですが、ベクトル和やスカラーベクトル積等の計算がFortranほど簡単ではなさそうに感じて質問しました
eigen等を活用しつつ頑張ってみます
827デフォルトの名無しさん
垢版 |
2020/12/21(月) 20:22:43.20ID:94n2fENi
そりゃそうだろな
汎用機の時点で科学計算と銀行計算の両方ができる
だから科学専用に作られているFortranと汎用のC言語は根本的に用途が違う

そもそもFortranの後に作られたのがC言語だし、時期も近いし、
だからFortranで出来ることをわざわざC言語でやったりはしない、
用途での住み分けがそのころからある

後発の方が簡単に出来るというのは幻想
2020/12/21(月) 21:07:13.89ID:HyYYfsZ0
簡単なことは簡単に言え

既成のソフトを使い慣れているならそれを使え
不満があるときに自分の理想との違いを埋めるのに
打って出る手段の1つにプログラミングがある
それはC++に限らない
たまたまC++を選んだのなら自らの名誉に恥じぬ努力をせいや
これまたC++に限ったことではないがな

あれ使えばいいやー、これ使えばいいやー
自分なんか物事を考えるだけ無駄なんだー

こういうスタンスのやつ、俺は反吐が出るほど大大大大大嫌い
2020/12/21(月) 23:35:19.34ID:5SN4/ItM
ヘッダファイルに
double hoge = 1.0/3.0;
みたいに書いてた場合、除算はどのタイミングで行われるんですか?初回呼び出し時のみですよね?
2020/12/21(月) 23:51:47.03ID:3sOyVj6l
大昔(40年ぐらい前?)とかもんのすごい特殊な環境用のコンパイラはしらんが
今の普通のコンパイラではそれはコンパイル時に計算される
2020/12/22(火) 00:34:06.43ID:M/dL4DYR
>>829
コンパイル時に解決されてると思います
2020/12/22(火) 00:35:40.93ID:M/dL4DYR
すみません、830で回答されてましたね
畳み込み、とかで検索してみては
2020/12/22(火) 02:07:17.74ID:bzbnZ90n
>>826
Fortranでも基本的にblasとかlapackに投げるだけじゃないの?
しかもC/C++からFortranルーチン呼べるし

「FortranではやりやすかったがC/C++ではやりにくかったこと」って非常に興味あるから具体的にどういうものか教えてほしい
2020/12/22(火) 06:36:52.20ID:GAvzsgv/
blasとかlapackがfortanで記述されてるからね
中身いじるような人がどれほどいるかはわからんけど
2020/12/22(火) 08:38:11.38ID:+a9RX7vJ
>>829
翻訳時
なぜなら1.0/3.0は定数式だからだ
これは昔とか今どきとか関係ない
2020/12/22(火) 09:08:43.07ID:z2CQLL3J
翻訳(interpret)ですか?
C++はコンパイル言語ではないのですか?
2020/12/22(火) 09:23:29.08ID:Yt10VcGs
翻訳(translate)でしょ。
2020/12/22(火) 09:26:00.82ID:AY4u6Qzg
コンパイラと構文解析とオートマトンって大学の授業でやったなぁ
839デフォルトの名無しさん
垢版 |
2020/12/22(火) 10:18:51.71ID:hq0fof4K
Cコンパイラ作ったよね。
2020/12/22(火) 12:04:28.60ID:GAvzsgv/
constexprとか中身がどうなってるのかもうわけわからん
2020/12/22(火) 16:28:31.76ID:cQdMNR1v
>>834
中身いじるような人がいないからこそ、fortranで(blasやlapack)でできる線形代数計算はC/C++でもできるだろうと思うのだが
2020/12/22(火) 23:28:55.02ID:cWduRySe
constexprともなるとどこまでコンパイル時計算してくれるかは
処理系依存と聞く…!
関数が絡んだ場合だけかもしれんが
2020/12/22(火) 23:41:36.57ID:Yt10VcGs
>>842
constexpr にまつわるルールはコンパイル時計算してくれる最低ラインを定めるもの。
どこまでコンパイル時計算してくれるかが処理系依存なのは初期のC言語から変わりないよ。
2020/12/23(水) 00:29:07.29ID:0vtm2rCB
constexpr指定したものはコンパイル計算でしょう?
2020/12/23(水) 01:06:37.35ID:BffjS4vY
>>844
コンパイル時評価可能(コンパイル時に評価するとは言っていない)
2020/12/23(水) 02:19:42.25ID:wEQUKH0P
>>844
constexpr 指定が付いた関数は定数式が要求される文脈において
与えられる引数も定数 (定数式) である場合に限りその関数呼出しは
定数式という扱いになる。

定数式が要求される文脈で入力が定数でないならエラーになるし、
定数式が要求されていない文脈であれば実行時計算だよ。

実行時計算にはならない (実行時計算が必要な文脈だとエラーにする) 指定として consteval が導入されたのは、
constexpr の文脈依存な挙動が面倒だと思ったやつがいたからだと思うよ。
2020/12/23(水) 06:16:15.13ID:ZPrNOuha
C++はまだ色々と足し続けてるのか
constexprはともかくconstinit, constevalて...
2020/12/23(水) 06:17:06.41ID:ZPrNOuha
まるで言語開発屋のおもちゃじゃねえか
2020/12/23(水) 08:41:53.85ID:iOQdV6uo
今頃気づいたのw
2020/12/23(水) 09:20:18.63ID:wEQUKH0P
自動で呼び分けて欲しいと思うこともあれば
コンパイル時に限って欲しいことだってあるだろう。
2020/12/23(水) 19:37:56.48ID:lj5PdyQr
1秒間に1万回くらい数値判定の計算をしてるのですが
Xが3桁の時のみTrueを返すようなコードで一番速いのってどんなコードですかね?
愚直にif(1000>X>=100)でやるのと
if(10>X/100>=1)ではどっちが速いんでしょうか
2020/12/23(水) 19:39:04.22ID:PgZc4XsV
前者
2020/12/23(水) 19:43:53.01ID:PgZc4XsV
多くのコンパイラは以下に変形しそうな気がする
if (X-100u<900u)

後者をコンパイラが最適化するかどうかはコンパイラ次第
2020/12/23(水) 19:47:49.74ID:PgZc4XsV
PCなら1秒に1万回程度なら気にしなくて良い
8bitマイコンだとこの判定だけでも10個以上の命令になったり
855デフォルトの名無しさん
垢版 |
2020/12/23(水) 20:03:20.62ID:rWjdGSAm
長さ数十億のbool型配列用意すれば早いんじゃね
isDigit3[x] だけで出るじゃん
2020/12/23(水) 20:04:42.24ID:psZzhFw3
>>851
それ条件式が間違ってるだろ
2020/12/23(水) 21:04:06.12ID:oO0RWe4j
根本的には、速度って環境依存の性質だから、本当に重要な話なら実測で確かめるしかない。

一般論としては、現代のコンパイラはそこらの人間より賢いから、やりたいことを素直に書いて最適化を任せるのがいい。
わかってない人が余計なことをやると、かえって遅くなる可能性が高い。

計算量のオーダーを変えるような、アルゴリズムレベルの最適化なら意味があるんだけど。
小手先のテクニックは通用しないと思っていい。
2020/12/23(水) 22:00:42.78ID:p3n5tJou
>>850
いうてほんとに定数式になってくれないと困る場面で定数評価してくれない事態に出くわしてないんだよなぁ・・
constexprなクラスとか作ってればあるのかもしれんが
2020/12/23(水) 22:21:55.80ID:JqE6cd4a
最適化にも限界はあるから、どういうコードの書き方ならコンパイラが最適化しやすいか、
ってのを知るのは必要なんやろうね
データアクセスの局所化とか偽の依存関係の除去とか
860デフォルトの名無しさん
垢版 |
2020/12/23(水) 23:11:04.90ID:pgaSoeQc
typedefで二重定義になった場合さぁ…同じ型だとコンパイルエラーにはならないんだよ…
なんか気持ち悪いので…typedefだけのヘッダーを呼ぶようにしたけど…同じ型だとOKなん?
861デフォルトの名無しさん
垢版 |
2020/12/23(水) 23:12:13.58ID:pgaSoeQc
ヘッダーに渡しても同じことか…相互参照してるんだった…
862デフォルトの名無しさん
垢版 |
2020/12/23(水) 23:13:21.42ID:pgaSoeQc
一応…間違えないように…ヘッダーに集約しておく…
2020/12/23(水) 23:13:34.29ID:KqYWGLnc
Ruby VM では、1秒間に、100万回ループすると、
Ruby中間言語を、JIT で機械語にコンパイルして、

1秒間に、1,000万回ループ出来るようになる
2020/12/23(水) 23:43:55.33ID:iOQdV6uo
いや指定した数だけループしろよ
何勝手に回数10倍に増やしとんじゃい
865デフォルトの名無しさん
垢版 |
2020/12/24(木) 06:19:28.22ID:TzdYJrci
サムソンを守るためのHuawei潰しという側面もある。
2020/12/24(木) 06:55:00.49ID:fOK7nTKz
んあ?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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