C++相談室 part153 at TECH
[2ch|▼Menu]
[前50を表示]
750:デフォルトの名無しさん
20/12/18 13:40:56.80 TZi3wQJw.net
>>737
何がしたいの?
元ソース貼ってるからそっちでコピペして
手元のGCCでコンパイルしてみれば再現するはずだよ

751:デフォルトの名無しさん
20/12/18 13:47:38.37 YAPYqYIf.net
>>741
邪魔くさいからココに貼るなってんだよ

752:デフォルトの名無しさん
20/12/18 14:07:04.35 TZi3wQJw.net
それは731に言ってくれ
俺は知らん

753:デフォルトの名無しさん
20/12/18 14:33:16.19 kYvjoJp5.net
>>729
gccではMLで夏くらいにfloat版の実装のコミットの話が出てたから次のリリースでは多分実装されてるんじゃないかな。

754:デフォルトの名無しさん
20/12/18 15:35:36.73 A9pQAhpY.net
>>729
23.20.1がHeader <charconv>のドラフトってどれだ?

755:デフォルトの名無しさん
20/12/18 15:37:59.88 TZi3wQJw.net
>>745
N4713

756:デフォルトの名無しさん
20/12/18 15:50:56.91 A9pQAhpY.net
URLリンク(cpprefjp.github.io)
URLリンク(cpprefjp.github.io)
webページ見れない理由あった?
>GCC: 8.0(整数のみ)
>Visual C++: 2017 update 7(整数のみ), update 9(full support)
俺ならこの二つ眺めて「GCCは未実装なんだなぁ」と思考停止して終わる

757:デフォルトの名無しさん
20/12/18 17:24:37.67 TZi3wQJw.net
>>747
そうか、思考停止するのか
よかったね
何だか色々と前提置いてるけど
俺は知らんよ、おまえさんの前提なんぞ
イヤミ口調のくせに脇が甘いな

758:デフォルトの名無しさん
20/12/18 17:28:32.84 Mxkr6hqK.net
priority_queue<int>に比較関数を指定したいとき、
priority_queue<int, vector<int>, greater<int>>
のようにすると思いますが、内部コンテナ vector<int> は別にデフォルトのままで良いし書くのが面倒なので省略したいです
可能ですか?

759:デフォルトの名無しさん
20/12/18 18:26:15.74 Xk0olBJ3.net
template <typename T>
using my_priority_queue = priority_queue<T, vector<T>, greater<T>>;

760:デフォルトの名無しさん
20/12/18 18:41:07.57 UPU6Cu+L.net
gccの場合、未実装でもスタブだけ存在する場合があるんですよね。
つまり、コンパイル時やリンク時にはエラーにならない。
悪いことに実行時にもエラーにはならず、静かにスルーされる場合さえあるんです。
ここまでの流れでもお気づきでしょうが、gccの熱烈なファンは、gccが後れを取ることが許せないんですよ。
ですから、gccの熱烈なファンサイトより、GNUのマニュアルを見ることをお勧めします。
マニュアルを見れば、たいていは、きちんと書いてあります。

761:デフォルトの名無しさん
20/12/18 19:45:59.90 PzyTX7K9.net
始皇帝氏

762:デフォルトの名無しさん
20/12/18 19:59:32.56 A9pQAhpY.net
>>748
ここ以外に各コンパイラでの実装具合が上手い事まとまってるサイトとかあんの?

763:デフォルトの名無しさん
20/12/18 20:30:00.87 A9pQAhpY.net
コンパイラのサポート状況 (C++17) - cppreference.com
URLリンク(ja.cppreference.com)
こっちでの表現は「初等文字列変換」になってんのか
分かるワケねーな

764:デフォルトの名無しさん
20/12/18 20:48:34.81 A9pQAhpY.net
>>746
N4713のpdfとかどこをどう漁れば出てくんだ?
全然見つからないんだけど

765:デフォルトの名無しさん
20/12/18 20:52:41.57 2rT2nv7x.net
>>755
N4713 c++で検索したらトップに出てきたぞ。
普段どんな検索しているんだよ。

766:デフォルトの名無しさん
20/12/18 20:53:49.00 UPU6Cu+L.net
URLリンク(github.com)
ここで検索すればドラフトならみられますよ。
向こうも見てるだろうけど。

767:
20/12/18 21:01:49.42 ivKQNPRV.net
>>751
関係ないけれども、gcc って今は C++ で記述されているんですよね
長い間私はそれをとても残念に思っています
オプティマイズは苦手であってもいいから C で記述されている C++ 処理系って存在するのでしょうか?

768:デフォルトの名無しさん
20/12/18 21:12:10.66 A9pQAhpY.net
>>756
>>757
URLリンク(cpprefjp.github.io)
URLリンク(ja.cppreference.com)
ここで紹介されている最終ワーキングドラフトでもない、
URLリンク(github.com)
こっちはたくさんあって何を選べばいいか分からない、
どうやってN4713のドラフトに行きついたんだ?

769:デフォルトの名無しさん
20/12/18 21:20:36.71 UPU6Cu+L.net
おーけーぐーぐるえぬよんなないちさん、と言いました。

770:デフォルトの名無しさん
20/12/18 21:37:45.97 A9pQAhpY.net
行き着いた、ってのは>>746の彼がだよ
どういう経緯で彼が「これこそが勉強すべきドラフトである」と結論したんだ?

771:デフォルトの名無しさん
20/12/18 22:07:42.21 TZi3wQJw.net
俺がN4713を見ていたことが、えらい気に入らない人がいるようだね
知らんがな
仮にwebページ見られなかったとして、どうやってN4713を落とせたのかとか
いちいち開陳せにゃならんの?

772:デフォルトの名無しさん
20/12/18 22:09:31.45 XdXLiWO3.net
>>722 >>725
差分プログラミングとかいう腐りきったプログラミングパラダイムでは
ハイディング上等なんだ、
そう思っていた時期が(ry

773:デフォルトの名無しさん
20/12/18 22:11:14.08 UPU6Cu+L.net
こちらから見えるということは、向こうからも見えてるということです。
気を付けなされよ。

774:デフォルトの名無しさん
20/12/18 23:08:30.12 A9pQAhpY.net
>>762
「ドラフトはこれを見ましょう」と大々的に紹介されてるわけでもなし、
落としたDLしたじゃなくて、どうしてそれを『選んだ』のかが不思議なんだよ
普通の経路じゃまず選べない

775:デフォルトの名無しさん
20/12/18 23:26:57.29 yxlBLqeq.net
c++ってやたうんちくばっか言う人多いよね
そんな人に限って仕事ができない
やたら得意げに説明してるけど、細かいことばっか気にしてて結局納期遅れwww
それなら、ある程度チャランポランでも納期通り出荷して、最悪現地デバッグの方がまだ救いようがある

776:デフォルトの名無しさん
20/12/18 23:29:15.18 zfI8p5qO.net
プログラマがうんちく言わないで何やるんだ?

777:デフォルトの名無しさん
20/12/18 23:48:52.19 A9pQAhpY.net
これの話の続きなのか
なら不思議は解消だ
謎は全部解けた

C++相談室 part151
スレリンク(tech板:20番)
20 名前:デフォルトの名無しさん[sage] 投稿日:2020/05/14(木) 18:32:35.87 ID:jF4/VTtK
>>17
ggrks
URLリンク(www.open-std.org)
あとcppreferenceはある意味ファンサイトみたいなものなので、何らかの標準化組織の公式サイトというわけじゃないよ

778:デフォルトの名無しさん
20/12/19 00:02:31.33 yZxXMpJa.net
そんな昔のスレは関係ないのでは?

779:デフォルトの名無しさん
20/12/19 00:20:03.02 0cb9HLXb.net
>>766
こういうとこでの情報提供や議論はともかく、うんちくでマウント取りたがるのは自信の無さの裏返しだからねぇ

780:デフォルトの名無しさん
20/12/19 00:23:06.73 sq702jvD.net
うんちくがうっとおしくて、仕事なら自分が勝ってる!って思い込みたいだけなんじゃないの

781:デフォルトの名無しさん
20/12/19 00:26:01.61 yZxXMpJa.net
図星つかれたからうんちくと言ってるのでは?

782:デフォルトの名無しさん
20/12/19 00:38:15.56 x1EY5aRu.net
スカトロスレ

783:デフォルトの名無しさん
20/12/19 00:42:57.09 0cb9HLXb.net
爆釣ww

784:デフォルトの名無しさん
20/12/19 03:34:46.64 yZxXMpJa.net
この野郎。
ウンチクンめ。

785:デフォルトの名無しさん
20/12/19 06:01:48.82 u3YcA1fK.net
>>765
だから何?
俺がどのドラフトをDLするかを
いちいちあんたの承認とらにゃいかんの?
こっちゃ不思議がられても関係ないんで
いちいち申告してもらわなくていい

786:デフォルトの名無しさん
20/12/19 08:07:11.10 vl/1bKki.net
まあお茶でも飲んでカルシウム取ろう

787:デフォルトの名無しさん
20/12/19 10:17:03.91 M1Nera9i.net
お茶にはカルシウム入ってないだろほとんど

788:デフォルトの名無しさん
20/12/19 10:18:39.16 dTYT78ol.net
お茶とカルシウム入りウェハースでも食えばええやん

789:デフォルトの名無しさん
20/12/19 10:25:15.46 cik2rIYa.net
何のはなしやねん

790:デフォルトの名無しさん
20/12/19 13:23:01.76 biviwPkb.net
Ca++

791:デフォルトの名無しさん
20/12/19 13:26:14.15 biviwPkb.net
正式版は有料だがドラフトはタダで手に入るからヒジョーに得がたいが、
やっぱドラフトの内容は随時変わるから、
居丈高に相手を論破してなじり倒すにはやっぱ最新のドラフトでないとイマイチ、

792:デフォルトの名無しさん
20/12/19 13:50:09.89 B7wez7Ce.net
よくわかりませんが、Chromeで実装されてるお試し機能がSafariで実装されてないからSafariはクソというのと似た話ですか?

793:デフォルトの名無しさん
20/12/19 14:02:30.06 biviwPkb.net
Chromeで実装されてるお試し機能がSafariで実装されてないからSafariはクソとなじったら
ドラフトの版が変わったらChromeの方がクソだった、みたいな

794:デフォルトの名無しさん
20/12/19 14:41:50.09 +cK8B71a.net
ゴミみたいなやり合いだな
くだらな
建設的な議論ができんのか

795:デフォルトの名無しさん
20/12/19 18:35:13.01 dM4VNuuI.net
C++のプロジェクトに始めて関わって既存コード眺めてたんだけど、関数やメソッドを呼び出す時って、呼び出す側が結果を格納する箱となる変数とかポインタを渡して、
メソッドや関数は成功失敗のint値をreturnする書き方しているんだけど、
これってC++の書き方なの?

796:デフォルトの名無しさん
20/12/19 18:41:15.86 5blMWj9s.net
>>786
まあその方がメモリ管理をミスを防ぎやすいからな
C++11以降だとまた世界が違うが

797:デフォルトの名無しさん
20/12/19 18:42:49.16 x1EY5aRu.net
どう世界が違うの?
いじわるしないで教えてよ

798:デフォルトの名無しさん
20/12/19 18:46:00.09 dM4VNuuI.net
メモリ管理の文化的な作法なのね。

799:デフォルトの名無しさん
20/12/19 18:47:02.46 5blMWj9s.net
>>788
スマートポインタが実用になったから、それでメモリ管理する方が文字通りスマートになった
だから、必要なら関数内部でメモリ確保する方法でもメモリ管理ミスが起こりにくい

800:デフォルトの名無しさん
20/12/19 19:25:11.20 p4OhEmVF.net
>>786
c++というかcの伝統だわな。
オブジェクトをヒープに置かなくていいという性能的なメリットもある。

801:デフォルトの名無しさん
20/12/19 19:59:05.03 HGWooSzm.net
Cだと不定長の配列やら文字列やら返す関数ひとつ作るだけで大事件だからなぁ
「いいですかー!この関数が返す配列はヒープ確保したものですよー!使い終わったらXXX__free()で解放してくださいよー!
解放忘れたらリークしますよー!!!絶対に最後に解放してくださいよー!忘れないでねー!絶っっっっっっ対に忘れないでねー!!!」
ってコメントやドキュメントやサンプルコードにしつこくしつこくしつこく書いて書いて書いて徹底的に注意喚起しないといけない
そして当然のように忘れられて「分かりにくい関数作りやがって」って叩かれる所までがお約束
vectorやstringをゴロッと返せば済む今はいい時代になったと思う

802:デフォルトの名無しさん
20/12/19 20:17:48.73 vl/1bKki.net
消費者が買い物袋用意するなんてレジ袋有料化みたいだな

803:デフォルトの名無しさん
20/12/19 20:19:43.48 yZxXMpJa.net
右辺値参照のおかげですよ。

804:デフォルトの名無しさん
20/12/19 21:06:02.20 ISt3uDJM.net
質問@:
例えば…std::vectorで配列を確保したとします…push_backで追加した時に…アロケーター??が…
アドレスの再割当てをしたとします…この時…vectorは要素のアドレスは連続である事は保証されますが…
この時のアドレスの再割当てって…同期?非同期?どうなるの?
つまり…push_back時に同期で行うのか…非同期でロジック流れて行っちゃうか…って所…。
非同期だと怖いんだけど…。
質問A:
std::vector<char>とやった場合…data()でchar*を取れますが…std::vector<char>に'\0'の概念って
あります?どうなんでしょうねぇ…。'\0'のために+1多めに確保するなんて事はしないと思いますが…
どうなん?内部でどうなってるのかは…解りません…。

805:デフォルトの名無しさん
20/12/19 21:33:09.17 HGWooSzm.net
普通に質問しろ

806:デフォルトの名無しさん
20/12/19 22:28:27.67 yZxXMpJa.net
>>795
アロケータの内部実装がどうなっていようとも、push_back()から戻った時にはデータは追加されているので、問題ないのでは?
std::vectorは末尾に0を追加したりしません。

807:デフォルトの名無しさん
20/12/19 22:39:50.71 u3YcA1fK.net
>>782
- 最新のドラフト
+ 正式版の規格


808:票



809:デフォルトの名無しさん
20/12/19 22:59:41.56 vl/1bKki.net
確かにCだと必要メモリの問い合わせの為に二度呼び出したり面倒でしたわ…

810:デフォルトの名無しさん
20/12/19 23:18:45.05 biviwPkb.net
>>798
正式版の規格票は金かかるやんけヽ(`Д´)ノ

811:デフォルトの名無しさん
20/12/19 23:20:05.98 biviwPkb.net
>std::vectorは末尾に0を追加したりしません。
左様いまだにstd::string::c_str()が内部で何をやっているのかわからん…

812:デフォルトの名無しさん
20/12/20 00:32:15.85 zH6cQZTj.net
誰もstringの話してないと思うが

813:デフォルトの名無しさん
20/12/20 07:06:06.65 u5Xjtcw/.net
>>801
msys64/mingw64/include/c++/10.2.0/bits/basic_string.h
ここに書いてあるぞ

814:デフォルトの名無しさん
20/12/20 09:47:23.01 C7ljP8CG.net
>>799
でも「直接メモリいじってる」て感覚があって好みだったなぁ
まあ自己満足でしかないのだけれど

815:デフォルトの名無しさん
20/12/20 10:51:49.27 KSHt8d36.net
今どきのC++(C++11以降)だと基本的にスコープ抜けたら開放される方式で実装するものなの?
なるべくnewせずにスタック変数にする or ヒープ確保するにしてもスマートポインタ使う
とかで

816:デフォルトの名無しさん
20/12/20 11:14:31.35 IFRd5RXQ.net
>>805
そうしたほうが簡単だから、C++11とか関係無くそうするだろ。

817:デフォルトの名無しさん
20/12/20 11:16:20.77 B3eFXD


818:1J.net



819:デフォルトの名無しさん
20/12/20 11:27:39.08 KSHt8d36.net
そうかな?
ライブラリとかでわざわざInitialize/Finalizeとか明示的に呼ばなきゃいけないの
結構ある気がするけど

820:デフォルトの名無しさん
20/12/20 11:52:43.58 mkiVvOjR.net
Finalizeが失敗する可能性があってエラーハンドリングしないといけない場合はあえてそうしているかもね

821:デフォルトの名無しさん
20/12/20 13:25:24.04 8M1CEzDz.net
あえてね!

822:デフォルトの名無しさん
20/12/20 13:31:53.40 1w6q/2mK.net
というかスコープ内で完結しない、グローバルな状態を持つものならそうするやろ

823:デフォルトの名無しさん
20/12/20 13:48:55.12 KSHt8d36.net
グローバルバカかな?

824:デフォルトの名無しさん
20/12/20 13:52:50.85 BqPIIXKk.net
お前が挙げてたそういうライブラリがInitialize/Finalizeの中で何やってるか考えれば自ずと答えはでるだろ

825:デフォルトの名無しさん
20/12/20 14:05:47.98 S1Ae4PMu.net
グローバルな初期化と後始末ならInitialize/Finalizeとか明示的に呼ぶ設計のが一番闇が少ない
ファクトリメソッドでオブジェクトを作ることにして、ファクトリ元オブジェクトの
コンストラクタとデストラクタでそれぞれInitializeとFinalizeでも良いが(呼び忘れ対策は完璧になるが
InitializeやFinalize自体のエラーハンドリングを考えるとやっぱビミョー

826:デフォルトの名無しさん
20/12/20 21:00:32.48 POdM0+je.net
変数名で対象変数のポインタを取得してくる実装(リフレクション?)をしたいんですけど
対象変数をポインタテーブルとかに書き下すことなくコンパイル時に変数名リテラルと対応するポインタを自動生成することってできますか?

827:デフォルトの名無しさん
20/12/20 21:02:59.13 POdM0+je.net
対象変数はstructかclassのメンバ変数を想定しています

828:デフォルトの名無しさん
20/12/20 21:23:18.64 B3eFXD1J.net
直接には無理
目的次第だけど基本的にはプリプロ駆使して頑張るしかない

829:デフォルトの名無しさん
20/12/20 22:39:57.26 pIq+bOjP.net
まずC#処理系を書きます

830:デフォルトの名無しさん
20/12/20 22:49:36.29 ZSjgwNod.net
車輪がでかすぎる

831:デフォルトの名無しさん
20/12/20 23:37:12.93 XnWb8UXr.net
マップファイルから生成

832:デフォルトの名無しさん
20/12/21 02:47:40.73 HVkDagg+.net
数値計算に興味がある方に聞きたいのですが、ベクトル演算はどのように実行していますか?
valarrayかeigenなのか、vectorでforを回すのか…C++の常識ではどうやるのか伺いたいです

833:デフォルトの名無しさん
20/12/21 03:43:19.44 tQs5NvLs.net
>>821
blasやlapackにルーチンがあるならそれを使う(ラッパーを作る)
要素の持ち方はvectorでもvalarrayでもその他クラスでも、一次元的にメモリに格納されるなら何でも良い
二次元以上の配列が行優先か列優先かさえ固定しておけば何でも良い

834:デフォルトの名無しさん
20/12/21 12:49:04.92 h5UrY03S.net
>>821
時と場合による

835:デフォルトの名無しさん
20/12/21 12:49:33.35 h5UrY03S.net
ベクトル演算
ていうだけじゃ広すぎて

836:デフォルトの名無しさん
20/12/21 12:52:20.80 XzTX0Cyb.net
SVDとかするなら自前実装なんか無駄だからeigen使う。それ以外なら>>822 の通りだな。

837:デフォルトの名無しさん
20/12/21 19:14:50.06 5SN4/ItM.net
みなさんありがとうございます
主に多次元の常微分方程式を解く目的でFortranからc++へ移行しようと考えていたのですが、ベクトル和やスカラーベクトル積等の計算がFortranほど簡単ではなさそうに感じて質問しました
eigen等を活用しつつ頑張ってみます

838:デフォルトの名無しさん
20/12/21 20:22:43.20 94n2fENi.net
そりゃそうだろな
汎用機の時点で科学計算と銀行計算の両方ができる
だから科学専用に作られているFortranと汎用のC言語は根本的に用途が違う
そもそもFortranの後に作られたのがC言語だし、時期も近いし、
だからFortranで出来ることをわざわざC言語でやったりはしない、
用途での住み分けがそのころからある
後発の方が簡単に出来るというのは幻想

839:デフォルトの名無しさん
20/12/21 21:07:13.89 HyYYfsZ0.net
簡単なことは簡単に言え
既成のソフトを使い慣れているならそれを使え
不満があるときに自分の理想との違いを埋めるのに
打って出る手段の1つにプログラミングがある
それはC++に限らない
たまたまC++を選んだのなら自らの名誉に恥じぬ努力をせいや
これまたC++に限ったことではないがな
あれ使えばいいやー、これ使えばいいやー
自分なんか物事を考えるだけ無駄なんだー

こういうスタンスのやつ、俺は反吐が出るほど大大大大大嫌い

840:デフォルトの名無しさん
20/12/21 23:35:19.34 5SN4/ItM.net
ヘッダファイルに
double hoge = 1.0/3.0;
みたいに書いてた場合、除算はどのタイミングで行われるんですか?初回呼び出し時のみですよね?

841:デフォルトの名無しさん
20/12/21 23:51:47.03 3sOyVj6l.net
大昔(40年ぐらい前?)とかもんのすごい特殊な環境用のコンパイラはしらんが
今の普通のコンパイラではそれはコンパイル時に計算される

842:デフォルトの名無しさん
20/12/22 00:34:06.43 M/dL4DYR.net
>>829
コンパイル時に解決されてると思います

843:デフォルトの名無しさん
20/12/22 00:35:40.93 M/dL4DYR.net
すみません、830で回答されてましたね
畳み込み、とかで検索してみては

844:デフォルトの名無しさん
20/12/22 02:07:17.74 bzbnZ90n.net
>>826
Fortranでも基本的にblasとかlapackに投げるだけじゃないの?
しかもC/C++からFortranルーチン呼べるし
「FortranではやりやすかったがC/C++ではやりにくかったこと」って非常に興味あるから具体的にどういうものか教えてほしい

845:デフォルトの名無しさん
20/12/22 06:36:52.20 GAvzsgv/.net
blasとかlapackがfortanで記述されてるからね
中身いじるような人がどれほどいるかはわからんけど

846:デフォルトの名無しさん
20/12/22 08:38:11.38 +a9RX7vJ.net
>>829
翻訳時
なぜなら1.0/3.0は定数式だからだ
これは昔とか今どきとか関係ない

847:デフォルトの名無しさん
20/12/22 09:08:43.07 z2CQLL3J.net
翻訳(interpret)ですか?
C++はコンパイル言語ではないのですか?

848:デフォルトの名無しさん
20/12/22 09:23:29.08 Yt10VcGs.net
翻訳(translate)でしょ。

849:デフォルトの名無しさん
20/12/22 09:26:00.82 AY4u6Qzg.net
コンパイラと構文解析とオートマトンって大学の授業でやったなぁ

850:デフォルトの名無しさん
20/12/22 10:18:51.71 hq0fof4K.net
Cコンパイラ作ったよね。

851:デフォルトの名無しさん
20/12/22 12:04:28.60 GAvzsgv/.net
constexprとか中身がどうなってるのかもうわけわからん

852:デフォルトの名無しさん
20/12/22 16:28:31.76 cQdMNR1v.net
>>834
中身いじるような人がいないからこそ、fortranで(blasやlapack)でできる線形代数計算はC/C++でもできるだろうと思うのだが

853:デフォルトの名無しさん
20/12/22 23:28:55.02 cWduRySe.net
constexprともなるとどこまでコンパイル時計算してくれるかは
処理系依存と聞く…!
関数が絡んだ場合だけかもしれんが

854:デフォルトの名無しさん
20/12/22 23:41:36.57 Yt10VcGs.net
>>842
constexpr にまつわるルールはコンパイル時計算してくれる最低ラインを定めるもの。
どこまでコンパイル時計算してくれるかが処理系依存なのは初期のC言語から変わりないよ。

855:デフォルトの名無しさん
20/12/23 00:29:07.29 0vtm2rCB.net
constexpr指定したものはコンパイル計算でしょう?

856:デフォルトの名無しさん
20/12/23 01:06:37.35 BffjS4vY.net
>>844
コンパイル時評価可能(コンパイル時に評価するとは言っていない)

857:はちみつ餃子
20/12/23 02:19:42.25 wEQUKH0P.net
>>844
constexpr 指定が付いた関数は定数式が要求される文脈において
与えられる引数も定数 (定数式) である場合に限りその関数呼出しは
定数式という扱いになる。
定数式が要求される文脈で入力が定数でないならエラーになるし、
定数式が要求されていない文脈であれば実行時計算だよ。
実行時計算にはならない (実行時計算が必要な文脈だとエラーにする) 指定として consteval が導入されたのは、
constexpr の文脈依存な挙動が面倒だと思ったやつがいたからだと思うよ。

858:デフォルトの名無しさん
20/12/23 06:16:15.13 ZPrNOuha.net
C++はまだ色々と足し続けてるのか
constexprはともかくconstinit, constevalて...

859:デフォルトの名無しさん
20/12/23 06:17:06.41 ZPrNOuha.net
まるで言語開発屋のおもちゃじゃねえか

860:デフォルトの名無しさん
20/12/23 08:41:53.85 iOQdV6uo.net
今頃気づいたのw

861:はちみつ餃子
20/12/23 09:20:18.63 wEQUKH0P.net
自動で呼び分けて欲しいと思うこともあれば
コンパイル時に限って欲しいことだってあるだろう。

862:デフォルトの名無しさん
20/12/23 19:37:56.48 lj5PdyQr.net
1秒間に1万回くらい数値判定の計算をしてるのですが
Xが3桁の時のみTrueを返すようなコードで一番速いのってどんなコードですかね?
愚直にif(1000>X>=100)でやるのと
if(10>X/100>=1)ではどっちが速いんでしょうか

863:デフォルトの名無しさん
20/12/23 19:39:04.22 PgZc4XsV.net
前者

864:デフォルトの名無しさん
20/12/23 19:43:53.01 PgZc4XsV.net
多くのコンパイラは以下に変形しそうな気がする
if (X-100u<900u)
後者をコンパイラが最適化するかどうかはコンパイラ次第

865:デフォルトの名無しさん
20/12/23 19:47:49.74 PgZc4XsV.net
PCなら1秒に1万回程度なら気にしなくて良い
8bitマイコンだとこの判定だけでも10個以上の命令になったり

866:デフォルトの名無しさん
20/12/23 20:03:20.62 rWjdGSAm.net
長さ数十億のbool型配列用意すれば早いんじゃね
isDigit3[x] だけで出るじゃん

867:デフォルトの名無しさん
20/12/23 20:04:42.24 psZzhFw3.net
>>851
それ条件式が間違ってるだろ

868:デフォルトの名無しさん
20/12/23 21:04:06.12 oO0RWe4j.net
根本的には、速度って環境依存の性質だから、本当に重要な話なら実測で確かめるしかない。
一般論としては、現代のコンパイラはそこらの人間より賢いから、やりたいことを素直に書いて最適化を任せるのがいい。
わかってない人が余計なことをやると、かえって遅くなる可能性が高い。
計算量のオーダーを変えるような、アルゴリズムレベルの最適化なら意味があるんだけど。
小手先のテクニックは通用しないと思っていい。

869:デフォルトの名無しさん
20/12/23 22:00:42.78 p3n5tJou.net
>>850
いうてほんとに定数式になってくれないと困る場面で定数評価してくれない事態に出くわしてないんだよなぁ・・
constexprなクラスとか作ってればあるのかもしれんが

870:デフォルトの名無しさん
20/12/23 22:21:55.80 JqE6cd4a.net
最適化にも限界はあるから、どういうコードの書き方ならコンパイラが最適化しやすいか、
ってのを知るのは必要なんやろうね
データアクセスの局所化とか偽の依存関係の除去とか

871:デフォルトの名無しさん
20/12/23 23:11:04.90 pgaSoeQc.net
typedefで二重定義になった場合さぁ…同じ型だとコンパイルエラーにはならないんだよ…
なんか気持ち悪いので…typedefだけのヘッダーを呼ぶようにしたけど…同じ型だとOKなん?

872:デフォルトの名無しさん
20/12/23 23:12:13.58 pgaSoeQc.net
ヘッダーに渡しても同じことか…相互参照してるんだった…

873:デフォルトの名無しさん
20/12/23 23:13:21.42 pgaSoeQc.net
一応…間違えないように…ヘッダーに集約しておく…

874:デフォルトの名無しさん
20/12/23 23:13:34.29 KqYWGLnc.net
Ruby VM では、1秒間に、100万回ループすると、
Ruby中間言語を、JIT で機械語にコンパイルして、
1秒間に、1,000万回ループ出来るようになる

875:デフォルトの名無しさん
20/12/23 23:43:55.33 iOQdV6uo.net
いや指定した数だけループしろよ
何勝手に回数10倍に増やしとんじゃい

876:デフォルトの名無しさん
20/12/24 06:19:28.22 TzdYJrci.net
サムソンを守るためのHuawei潰しという側面もある。

877:デフォルトの名無しさん
20/12/24 06:55:00.49 fOK7nTKz.net
んあ?

878:デフォルトの名無しさん
20/12/24 06:58:51.74 TzdYJrci.net
文大統領がトランプ大統領に、Huaweiを潰すよう勧めたそうです。

879:デフォルトの名無しさん
20/12/24 07:53:25.30 X8ie3AzF.net
>>863
C++ならはじめから秒2000万回ループできるコードになる

880:デフォルトの名無しさん
20/12/24 08:12:44.86 TzdYJrci.net
このプログラムは応答していないためシステムによって閉じられますって出るんじゃないの。

881:はちみつ餃子
20/12/24 10:18:24.14 ys2W6z1g.net
>>860
OK
URLリンク(timsong-cpp.github.io)

882:デフォルトの名無しさん
20/12/24 11:16:41.02 h4Gph9I0.net
>>854
手元の32bitマイコン(除算器なし)だと
uint16_t v; に値入ってたとして、
if(v >= 100 && v < 1000) よりは ((v >= 100) & (v < 100p

883:デフォルトの名無しさん
20/12/24 11:27:11.76 h4Gph9I0.net
>>871
途中で送ってもうたorz
((v >= 100) && (v < 1000))のが気休め速い感じだったな。
あとLUTもほぼ変わらん。LUTはもう少し複雑な計算で、
かつキャッシュにテーブルが入ってくると鬼速だろうけど。
単純な比較のみだからあまり速い方法ないのかもね〜
ダメ元で掛け算とビットシフトで/100する処理も試したけど
ちょっと遅くなったorz
つか、32bitマイコンだと100us周期程度の割り込みハンドラで
この水準まで自分は気にしないだす。
あとC++ならinline化とかその辺をまずチェックでしょうさ。

884:デフォルトの名無しさん
20/12/24 17:12:04.54 tg7gMCA8.net
>>872
if ((unsigned)v - 100u < 900u)
のが早くない?
テーブルは論外だ
アドレス計算コストの方が高そうだし
ROMサイズやキャッシュ汚染などの悪影響がある

885:デフォルトの名無しさん
20/12/24 19:53:19.25 9+0irhfK.net
if ((unsigned)v - 100u < 900u)
こういうのは減算とコンペア(実質減算)の2回の演算が常に走るから必ずしも速くないんじゃないかな。
&&で繋ぐ方がショートサーキットが働いて1回で済む場合がある。
演算で0との比較に落とせるなら別だけど。

886:デフォルトの名無しさん
20/12/24 19:56:18.95 VQIKvM0h.net
そのくらいなら最適化に任せた方がいい気がするが……

887:デフォルトの名無しさん
20/12/24 21:38:01.43 B83YCBUh.net
比較がボトルネックってのは本当だろうかとは思わなくもない
まあ、データ転送とか切り詰めまくって残すは比較のみ、ってのもありうるけど

888:デフォルトの名無しさん
20/12/24 21:38:20.67 X8ie3AzF.net
整数の減算は非常に高速
条件分岐は遅いし分岐予測を汚染する
コンパイラの最適化を見てると良い
範囲判定は大抵>>873のようなコードになる

889:デフォルトの名無しさん
20/12/24 21:41:03.65 X8ie3AzF.net
コード的には普通に
if (100 <= x && x < 1000)
と書いておけば良い
コンパイラが最適化するから
x/100を比較するのは
意味的にも意味不明だし
速くなることもない

890:デフォルトの名無しさん
20/12/24 21:51:18.77 X8ie3AzF.net
ISRの最適化なら
レジスタを節約して待避する数を減らすとか
レジスタバンクを使ってレジスタを切り替えるとか
RAM上で実行するとか
割り込みを許可せずに高速化とか(MIPSの場合)
まあ色々とチューニング出来る余地がある
小規模DSPなんかだと
いまだにISRをアセンブラで書いたりする

891:デフォルトの名無しさん
20/12/25 14:04:51.84 L6KY61Ck.net
バンク切り替えテクニックですか。
むかしのインターフェース誌っぽいですね。

892:デフォルトの名無しさん
20/12/25 17:40:14.36 j6GWo/XP.net
昔のテクニックが今でも有効

893:デフォルトの名無しさん
20/12/25 20:23:57.32 KGl9PDWX.net
template<size_t A, size_t B>
class tmp{};
template<size_t N>
void test(tmp<N, N>&){
std::cout << “A”;
}
template<size_t A, size_t B>
void test(tmp<A, B>&){
std::cout << “B”;
}
上のような関数があったときにtest(tmp<1,1>{});がどちらを呼ぶか規格で決まってる?

894:デフォルトの名無しさん
20/12/25 22:18:37.12 9Tm+xBHp.net
テンプレート引数が少ないtmp<N, N>の勝ち

895:デフォルトの名無しさん
20/12/26 00:14:55.00 biNpl0R5.net
using FunctorType = std::function<void()>;
struct RecursiveMapperType;
using InternalMapperType = std::map<std::string, RecursiveMapperType>;
struct RecursiveMapperType : public InternalMapperType
{
RecursiveMapperType(){}
};
こういうコードをネットで見かけたんだけど
RecursiveMapperTypeを前方宣言してInternalMapperTypeを宣言
RecursiveMapperTypeをInternalMapperTypeを継承して作成していることのメリットがよくわからない。
struct RecursiveMapperType : public InternalMapperType
{
RecursiveMapperType(){}
};
using RecursiveMap = std::map<std::string, RecursiveMapperType>
だとだめなのだろうか?
誰か教えて下しあ

896:デフォルトの名無しさん
20/12/26 00:40:10.65 3VlCU3bq.net
>>884
上のコードと下のコードの RecursiveMapperType の定義はまったく同じに見えるんだけど、何が違うの?

897:デフォルトの名無しさん
20/12/26 00:50:04.37 biNpl0R5.net
>>885 さん
すみません。
下の方のRecursiveMapperTypeですが継承元消し忘れてました。
下のようなkたちです
struct RecursiveMapperType
{
RecursiveMapperType(){}
};
using RecursiveMap = std::map<std::string, RecursiveMapperType>

898:デフォルトの名無しさん
20/12/26 03:46:58.69 fBIAR6pR.net
URLリンク(ideone.com)

899:デフォルトの名無しさん
20/12/26 15:10:58.71 3VlCU3bq.net
>>886
それじゃ全然機能が違うっていうかその RecursiveMap 何の役にも立たないでしょ。
元の RecursiveMapperType の機能が理解できてないだけか。

900:デフォルトの名無しさん
20/12/26 16:40:20.18 vGzfsLf/.net
再帰的な構造を定義したくて自分自身の型を含めたものを継承してるわけで
それを実現するには前方宣言するしかない
というね

901:デフォルトの名無しさん
20/12/26 17:13:57.40 UNoc468U.net
再帰的なコンテナは、フィールドが出来た時点で破綻するのでは?

902:デフォルトの名無しさん
20/12/26 18:07:48.30 TLGOuMOF.net
URLリンク(cpprefjp.github.io)
>不完全型を要素にする例 (C++17)
これの亜種

903:デフォルトの名無しさん
20/12/27 06:31:05.42 QkMmRpj8.net
C++23に持ち越された契約は何が変わるんだろね。

904:デフォルトの名無しさん
20/12/27 17:59:23.18 wQ5c+q6H.net
ありがとうございます。なんとなくイメージできました。
コードの設計ってまだよくわからないのですが、
再帰処理のためにこうするのって比較的普通なことなんですか?

905:デフォルトの名無しさん
20/12/27 18:23:25.49 tp3tetyk.net
>>893
知らんよ。
普通かどうかなんて気にしてどうするの?ここで名無しの誰かに yes/no 答えてもらって何か意味ある?

906:デフォルトの名無しさん
20/12/27 18:33:52.26 7Rx7y5wp.net
>>893
STLのクラスを継承して階層構造を実現するテクは応用編って感じがする
もっと基本的なやり方をするならデザパタのcompositeパターンを使う
とかかね

907:デフォルトの名無しさん
20/12/27 18:47:54.32 7Rx7y5wp.net
設計を学ぶならデザパタはひと通り見ておいて損はないぞ

908:デフォルトの名無しさん
20/12/27 18:49:43.74 QkMmRpj8.net
ヘネパタ、パタヘネ、デザパタ。

909:デフォルトの名無しさん
20/12/27 22:11:00.35 QkMmRpj8.net
newのコストは気にされますが、deleteのコストは見逃されがちです。

910:デフォルトの名無しさん
20/12/28 02:23:23.12 ibU6N4ur.net
あるクラスのコンストラクタのデフォルト引数を変更するときってどうしたらいいの?
オーバーロードすれば良い?

911:デフォルトの名無しさん
20/12/28 07:27:12.64 7Z4wU2qk.net
単純に変更じゃダメな理由は?
他のライブラリ?

912:デフォルトの名無しさん
20/12/28 07:33:40.98 pesKZps1.net
stlコンテナを継承するのはアウトだろ。
うまくやらないとデストラクタが呼ばれなくなっちゃうぞ

913:デフォルトの名無しさん
20/12/28 09:00:44.26 i4NtF28F.net
じゃあうまくやりましょうや。

914:デフォルトの名無しさん
20/12/28 09:44:51.94 bVWPeYFg.net
そもそもC++ではデストラクタを仮想にしてないってことは「継承すんなよ」って宣言だからなぁ

915:デフォルトの名無しさん
20/12/28 09:55:45.06 W/k+iOkV.net
なんで継承しないようにしたか意見表明文みたいなモンはどっかにあるのか?

916:デフォルトの名無しさん
20/12/28 10:20:49.88 ErVwTltE.net
仮想関数化するとしない場合に比べて余分なコストがかかるから、必要な理由がない限り基本的にそれは避けるということじゃないかな

917:デフォルトの名無しさん
20/12/28 10:32:20.80 4OiRlqvR.net
C++は1クロックでも速く動作させるために非仮想関数をデフォルトにしたのは理解できる
Javaは動作速度よりもオブジェクト指向の継承動作の一貫性を重視してすべて仮想関数にした、これも時代を考えれば理解できる
C#もJavaと同じくデフォルトを仮想関数にしておいて欲しかったのだが、C#はC++を尊重してデフォルト非仮想関数なんだよね
これはちょっと残念

918:デフォルトの名無しさん
20/12/28 11:33:10.90 s2RdB6EU.net
継承して機能追加っていうのがオブジェクト指向的にもどうかと思うね

919:デフォルトの名無しさん
20/12/28 12:34:23.27 QmdcnH/3.net
finalキーワードがこの時代にあれば間違いなく付けただろうな
文句言ってる奴はガイジ

920:デフォルトの名無しさん
20/12/28 12:42:44.62 UEnoPUHl.net
>>903
継承すんな、は言いすぎ。
private継承なら問題ないと思うけど。実際たまに使われているし。

921:はちみつ餃子
20/12/28 13:19:25.85 N6A7dpOQ.net
デストラクタが仮想ではないものを継承したときの具体的な問題は
スライシングが起こりうるということと、
起こってもコンパイラが (少なくともコンパイル時には) 捕捉できないことが多いということにあって、
スライシングが起こらないように使う分には問題はない。
設計的に綺麗かどうかはまた別の話だけど。
shared_ptr が (デストラクタが仮想でなくても) 元の型のデストラクタを呼んでくれたりするんで、
場合によってはそういう設計もアリということなんだと思う。

922:デフォルトの名無しさん
20/12/28 14:12:57.70 02+J4aSB.net
>>910
デストラクタが仮想なものを継承してもスライシングは起こりうるよね?そこは関係なくね?
URLリンク(en.wikipedia.org)
> In C++ programming, object slicing occurs when an object of a subclass type
> is copied to an object of superclass type: the superclass copy will not have
> any of the member variables defined in the subclass. ...

923:デフォルトの名無しさん
20/12/28 17:31:09.93 V+A6vVBD.net
C++自由すぎてしんどいな
後方互換性と引き換えに払った代償か

924:はちみつ餃子
20/12/28 17:46:19.93 N6A7dpOQ.net
>>911
スライシング自体は起こるけど、それで予想外のことやメモリ管理の矛盾は起こり難い。

925:デフォルトの名無しさん
20/12/28 17:50:37.04 i4NtF28F.net
自由に羽ばたける翼。

926:デフォルトの名無しさん
20/12/28 18:06:08.49 V+A6vVBD.net
自由すぎて困る部分はLinterを併用することで勝手に回避しろってことかな

927:デフォルトの名無しさん
20/12/28 18:37:15.29 v+s+VlFU.net
だってCの設計思想が「人間を信用する」だもん
セキュリティが重視される現代的な言語のベースとしては致命的に合ってないんだよね

928:デフォルトの名無しさん
20/12/28 18:40:02.12 02+J4aSB.net
>>913
やっぱり関係がわからない。
デストラクタが仮想ではないものを継承したときに限ってスライシングが予想外のことや
メモリ管理の矛盾につがなる例をひとつでいいから見えてもらえない?

929:デフォルトの名無しさん
20/12/28 18:40:41.01 02+J4aSB.net
s/見えてもらえない?/見せてもらえない?/

930:デフォルトの名無しさん
20/12/28 19:07:39.46 bVWPeYFg.net
A <|- B, C みたいなときにB, CをnewしてA*として管理しようとすると破棄の時にAのデストラクタしか呼ばれない

931:デフォルトの名無しさん
20/12/28 19:09:58.26 UEnoPUHl.net
>>911
仮想でないデストラクタが話題のスコープなのに、スライシングにスコープを移したら議論にならないでしょ。
911) デストラクタが仮想なものを継承する→スライシングになるものが存在する
という命題は
910) デストラクタが仮想ではないものを継承する→スライシングになるものが存在する
という命題と矛盾するわけではない(両立する)ので、その議論はあんまり意味がない。

932:デフォルトの名無しさん
20/12/28 19:14:08.97 i4NtF28F.net
スライシング・オプティマイザーとかどうよ?

933:デフォルトの名無しさん
20/12/28 19:36:49.42 02+J4aSB.net
>>910
> スライシングが起こらないように使う分には問題はない。
ここもおかしいんだよね。
デストラクタが仮想ではないものを継承して派生クラスのオブジェクトを new で作って
基底クラスのポインタを通して delete したら未定義動作になるわけだけど、
これはスライシングを起こしていなくても問題になる。
「派生クラスのオブジェクトを new で作って基底クラスのポインタを通して delete」のことを
「スライシング」と呼んでる気配もあるんだけど、それは明らかに誤りだろうし。

934:デフォルトの名無しさん
20/12/28 19:43:43.44 592FfNkQ.net
>>900
変更ってどうやるの?
毎回好きな引数を与えよってこと?
面倒なので、自分の好きな引数を自分のコードの中ではデフォルトにできれば良いのにと思ったのだが、こういう考えは間違っていますか

935:デフォルトの名無しさん
20/12/28 19:51:33.62 7Z4wU2qk.net
>>923
make関数作るのはダメなん?

936:デフォルトの名無しさん
20/12/28 19:59:11.40 v+s+VlFU.net
デストラクタはpublic仮想かprotected非仮想かpublic非仮想finalのどれかにしろ
っていう一般的結論でよくね

937:デフォルトの名無しさん
20/12/28 21:21:17.65 sYj4+JXZ.net
>>925
自分で書くときはそう
標準のコンテナのように既存のクラスがそうでなかったら?が発端だからなぁ
個人的には仮想デストラクタがなければ継承はしない
(一部のイディオムを除けば)private継承にするくらいなら委譲する。

938:デフォルトの名無しさん
20/12/28 21:54:56.73 wzipnhb8.net
デストラクタがprotected:であっても非仮想なら継承したらアウトなんじゃ…
派生クラスの破棄時に基底クラスのデストラクタが呼ばれない
的な意味で

939:デフォルトの名無しさん
20/12/28 21:57:44.66 dWPs/bUX.net
>>924
オブジェクトを作るための関数を作ってはどうかという意味ですか?
確かにそれで良いのでそうします

940:デフォルトの名無しさん
20/12/29 07:11:18.52 2gsaGKLd.net
相称型プログラミング。

941:デフォルトの名無しさん
20/12/29 07:28:15.94 2gsaGKLd.net
いま私大事なこと言いましたよ。

942:デフォルトの名無しさん
20/12/29 07:37:07.18 H8QGk97F.net
プログラミング学びには来ないだろ
こんな途上国に

943:デフォルトの名無しさん
20/12/29 07:38:50.44 2gsaGKLd.net
【CSS規格、読書感想文】
CSSがアイデアであった段階からスクリプト言語で実装され、初の大規模採用であったネットスケープにおいてもJavascriptによって実装されていたため、規格そのものがC/C++で効率的になるよう設計されていない。※
現行の規格に対して効率的な実装を施したとしても、将来の規格バージョンで維持できると限らないため、結局、スクリプト言語と同様の非効率を許容することになる。
これはつまり、ほとんどのシンボルを動的に確保することを意味する。
※HTML5規格は、C/C++で効率的に実装できるように仕組まれている。


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

288日前に更新/258 KB
担当:undef