C++相談室 part153 at TECH
[2ch|▼Menu]
[前50を表示]
700:デフォルトの名無しさん
20/12/15 16:06:36.42 cCubMtK6.net
>>689
wstringだろうがu16stringだろうがu32stringだろうが状況変わらんぞ

701:デフォルトの名無しさん
20/12/15 16:37:15.21 pcemzeew.net
>>690
質問主ですが、是非ともkwskしてくだしあ

702:デフォルトの名無しさん
20/12/15 16:39:59.71 4y27nUGT.net
utf16はサロゲートペアちょんぎらないようにしないとな

703:デフォルトの名無しさん
20/12/15 20:33:42.18 DseQeO8W.net
合字とか異体字セレクタとかもな
文字を扱うというのは大変なんだ

704:デフォルトの名無しさん
20/12/15 21:47:00.55 F7+1e89x.net
>>688
1バイト目とそれ以降は重ならないからそういうことは起こらないはず

705:デフォルトの名無しさん
20/12/15 22:25:44.23 jc1ZwvrK.net
そもそもstring::findがあるのは文字列から文字列を探す需要が高いからじゃないですかね
vector含む各コンテナから探すのはほとんどの場合要素単位だから汎用的なstd::findを使えということと解釈

706:デフォルトの名無しさん
20/12/16 06:17:15.68 vxgFSXGy.net
>>696
だよね
std::stringのfindは要素を探すんじゃなくて、
要素(char)の連なり=部分文字列を探すもので
vectorとかのコンテナのそれとは異質だし蛇足とは思えない

707:デフォルトの名無しさん
20/12/16 08:58:52.32 O+yPS5En.net
>>692
了解
>>686
kwsk

708:デフォルトの名無しさん
20/12/16 09:05:13.62 9tcp04F0.net
まぁ汎用的というか、stlのアルゴリズムはほとんどが全コンテナに対して共通のコードに出来るからそうしてる(グローバルな関数にしてる)んじゃないかね
実際問題、共通のインターフェースを継承によって表現するのでない限り、同じコードをあちこちメンバ関数にするのは不自然
逆に共通のインターフェースにすべきクラスの機能を無理に普通の関数にするのも馬鹿げてる

709:はちみつ餃子
20/12/16 10:59:12.23 zkq7HUY5.net
アドホック多相とパラメトリック多相の違い。

710:デフォルトの名無しさん
20/12/16 11:28:07.30 Hv+rjawS.net
データ構造とアルゴリズムを合わせたものがクラスでありオブジェクト指向言語の特徴の1つと教わった
いまは汎用アルゴリズムが再び外部に分離されるようになってきてるのかな
テンプレート・ジェネリクス・インターフェースのおかげかな?
型Tに対する操作を外部化しておいたほうが汎用的で型Tを実装するすべてのクラスが操作を個別に持つのは無駄ってことか

711:デフォルトの名無しさん
20/12/16 11:50:27.11 uK3tjXUx.net
beginとendをペアで指定しないといけないポインタ的iteratorのせいで外部化せざるを得なかったという方が正しいんじゃないですかね

712:デフォルトの名無しさん
20/12/16 11:58:03.72 cXvwu3qd.net
↓のサイトでも外人が同じ議論してるね
誰か要約してください
URLリンク(stackoverrun.com)
Why does std::string have a find member function while std::vector and friends don't have it?
Is there anything wrong with using std::find on the string?

713:はちみつ餃子
20/12/16 13:09:55.17 zkq7HUY5.net
>>701
オブジェクト指向にも種類がある。
ただひとつのオブジェクト指向がオブジェクト指向たる基準があるわけではなくて、
わりとふんわりした概念だよ……。
C++ の場合はカプセル化に軸があると思う。
隠されていないデータを処理する分にはメンバ関数にする必然性がない。

714:デフォルトの名無しさん
20/12/16 13:27:14.81 j60AFdVm.net
C++ってカプセル化できるんでしたっけ?

715:デフォルトの名無しさん
20/12/16 13:34:22.28 KCK/bj61.net
抜け道があるかって意味なら、java等もカプセル化できないってことになるけど

716:デフォルトの名無しさん
20/12/16 13:45:31.91 O+yPS5En.net
>>701
そういうことじゃねえよ
データ構造とアルゴリズムごちゃ混ぜにしたのをクラスと言い張る意味はない
1つの目的のためのお膳立てを揃えたものがオブジェクトでオブジェクトの種類がクラスだ
C++標準のライブラリではデータ構造はコンテナ、アルゴリズムは関数テンプレートとして分離されている
コンテナは配列やリストといったデータ構造を提供するまでにとどめ
それらを使って何かする応用までメンバにはせず関数テンプレートにしてある

717:デフォルトの名無しさん
20/12/16 13:50:56.36 j60AFdVm.net
>>706
Javaのリフレクションで何でも呼べる抜け道みたいな話ではなく
C++ってヘッダーファイルにprivateメンバー書かないといけないじゃん
そのせいで内部実装が変わったらライブラリ利用者にヘッダーファイルを差し替えてもらわないといけなかったりする
これってカプセル化できてないってことじゃない?
pimplとかテクニックがあるけどさ

718:デフォルトの名無しさん
20/12/16 13:54:21.41 vzlQaAwm.net
>>708
古い知識ですまんが、素直に抽象基底クラス被せるでだめなん?

719:デフォルトの名無しさん
20/12/16 13:55:52.62 KCK/bj61.net
なる。
そういうことならpmplかインターフェースクラスを定義するかしか思い浮かばないな

720:デフォルトの名無しさん
20/12/16 14:40:21.32 O+yPS5En.net
> 内部実装が変わったらライブラリ利用者にヘッダーファイルを差し替えてもらわないと
これ、そんなに深刻な問題か?
ライブラリの更新なんてリポジトリ決めてバージョン管理して
あとは勝手に落とせで運用できてるやん

721:はちみつ餃子
20/12/16 15:35:04.62 zkq7HUY5.net
現実的な部分では運用でなんとかしてる部分はあるのも確かだが、
現実に対する妥協なのでパラダイム的な話とは区別が必要じゃない?
まあ不可分なところもあるんで微妙な話ではあるけども。

722:デフォルトの名無しさん
20/12/16 16:36:11.97 uK3tjXUx.net
>>708
それってモジュール使えば解決できる問題じゃないんでしたっけ

723:デフォルトの名無しさん
20/12/16 18:14:53.45 O+yPS5En.net
>>712
運用できていても、いささかでも無理があれば
まだ余裕があるうちでも将来を見据えて
議論する価値が出てくるね
問題は無理を全く感じていないことを
空想論的に問題視することだ
個人的に問題視するのは勝手だが
他人が付き合ってくれないときにしつこくすることだ

724:デフォルトの名無しさん
20/12/16 18:54:24.56 G781YURu.net
意義深い議論が展開されてるな

725:デフォルトの名無しさん
20/12/16 22:51:18.04 IUrbfkPB.net
C++はゼロコストで極力あらゆる制御をプログラマーに与えることを
使命ていうか至上命題にして至高のレーゾンデートルとみなしているように見えるので
プログラミングパラダイムを論じるにはいまいちに思はるる、
やっぱヘッダファイルとか批判者にとってかっこうの餌食でありその光景がまさに展開された、

726:デフォルトの名無しさん
20/12/16 22:58:46.39 IUrbfkPB.net
きちんとオブジェクト指向するんなら継承は全部virtualであるべきや
といってもC++だけにあてはまる批判ではないが
Base::Foo()とDerived::Foo()が異なる振る舞いで定義されているときに、
func(Base&)にDerivedを渡したらfunc()の中ではBase::Foo()が呼ばれるとか
危険極まりない
この基準で言ったらたいていの似非オブジェクト指向言語はNG

727:デフォルトの名無しさん
20/12/16 23:05:40.32 L6k9APCP.net
不毛な宗教戦争よ

728:デフォルトの名無しさん
20/12/16 23:25:11.55 2c+prgNQ.net
クラスベースオブジェクト指向はすべて似非オブジェクト指向
アランケイ「C++のオブジェクト指向?知らない子ですね…」

729:デフォルトの名無しさん
20/12/17 01:05:17.90 X4tT/GwL.net
>>716
>C++はゼロコストで極力あらゆる制御をプログラマーに与えることを
>使命ていうか至上命題にして至高のレーゾンデートルとみなしているように見えるので
半分は正しいがそれならcでええやんてなる。
c++のc++たる所以(もしくは厨受けするところ)ってのは、ゼロコストなのにさらにどんなに高級な機能も入れられるんやで〜ってところだろ。

730:デフォルトの名無しさん
20/12/17 01:10:53.36 YFuWJYb1.net
>>717
え、その場合仮想関数ならDerived::Fooやろ?
非仮想とか値渡しならそうだけど

731:デフォルトの名無しさん
20/12/17 07:05:17.82 iG8ucCJK.net
非仮想だとそうなっちゃうっていう批判なんだろ
ハイディングなんかする方が悪いと思うけど

732:デフォルトの名無しさん
20/12/17 07:08:07.45 4VSV+Zch.net
>>717
仮想継承の話かと思ったら
そうじゃないようだな

733:デフォルトの名無しさん
20/12/17 08:15:27.96 61mx8GyZ.net
>>720
「使った機能にあったコスト」だよ。
ゼロコストはあくまで機能を使わなかった場合の話。
cの機能しか使わなかったらcのコストしかかからないのが基本方針だろ。

734:デフォルトの名無しさん
20/12/17 11:41:30.12 YFuWJYb1.net
>>722
あぁそういうことか・・
ちょっと自分の常識からかけ離れてるから理解できんかった

735:デフォルトの名無しさん
20/12/17 14:49:46.67 4VSV+Zch.net
#include <charconv>
using namespace std;
int main()
{
char str[] = "123";
double dbl;
from_chars(str, str + 3, dbl);
}
Visual Studioでは通るんだけど、GCCではダメ
どうも戻りのfrom_chars_resultがテンプレートになってて推論に失敗してるようなんだけど
規格ドラフト見てもfrom_chars_resultがテンプレートだなんてどこにも書いてない
これGCCがおかしいんだよな?
バグレポ上がってたりする?

736:デフォルトの名無しさん
20/12/17 14:50:46.30 4VSV+Zch.net
バージョン書き忘れた
Visual Studio: 19.28.29334
GCC: 10.2.0

737:デフォルトの名無しさん
20/12/17 15:56:08.03 UR7Dc4KD.net
>>726
整数型だけしかサポートしてないよ

738:デフォルトの名無しさん
20/12/17 17:33:27.07 4VSV+Zch.net
>>728
23.20.1 Header <charconv> synopsisにはfloat, double, long doubleが挙がってるんだけど・・・
ああ、GCCがってことねthx

739:デフォルトの名無しさん
20/12/17 22:56:50.01 mqVedE2Y.net
gccの傾向として、熱烈な信者がいて、出来ないことを出来ると宣伝したり、劣っているものを優れていると宣伝したりする場合がある。
ところが、そのような場合、GNUのマニュアルは「出来ない」「劣る」と明言している場合が多い。
したがって、gccについてはみだりに検索せず、GNUのサイトを見ることをお勧めします。

740:デフォルトの名無しさん
20/12/18 01:08:57.52 CTNkAd3G.net
>>726 「ダメ」がコンパイルエラーの意味ならエラーメッセージも挙げてよ。

741:デフォルトの名無しさん
20/12/18 01:16:51.95 UPU6Cu+L.net
ダメコンは、ダメージコントロールの略ですよ。

742:デフォルトの名無しさん
20/12/18 05:02:08.68 t+i2XnfT.net
継承使うと密結合になり変更に弱くなるし(実行時のオーバーヘッドにもなりそう)
規約で縛るというSTLの実装には好感が持てる

743:デフォルトの名無しさん
20/12/18 06:51:33.39 TZi3wQJw.net
>>731
W:\>g++ g1.cpp
g1.cpp: In function 'int main()':
g1.cpp:8:33: error: no matching function for call to 'from_chars(char [4], char*, double&)'
8 | from_chars(str, str + 3, dbl);
| ^
In file included from g1.cpp:1:
C:/msys64/mingw32/include/c++/10.2.0/charconv:595:5: note: candidate: 'template<class _Tp> std::__detail::__integer_from_chars_result_type<_Tp> std::from_chars(const char*, const char*, _Tp&, int)'
595 | from_chars(const char* __first, const char* __last, _Tp& __value,
| ^~~~~~~~~~
C:/msys64/mingw32/include/c++/10.2.0/charconv:595:5: note: template argument deduction/substitution failed:
In file included from C:/msys64/mingw32/include/c++/10.2.0/charconv:40,
from g1.cpp:1:
C:/msys64/mingw32/include/c++/10.2.0/type_traits: In substitution of 'template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = false; _Tp = std::from_chars_result]':
まだまだ延々続くけど、こんくらいでいい?

744:デフォルトの名無しさん
20/12/18 09:49:45.23 /2PllW9k.net
>>727
vsでも2017update7は同様のエラーみたいだなぁ

745:デフォルトの名無しさん
20/12/18 11:01:15.84 nIUIWdb5.net
>>733
何言ってんだ継承使いまくりだぞ

746:デフォルトの名無しさん
20/12/18 11:36:27.07 YAPYqYIf.net
>>734
ココに上げろよ
URLリンク(pastebin.com)

747:デフォルトの名無しさん
20/12/18 12:09:40.31 opBsRLFO.net
オプションは無しなんだ

748:デフォルトの名無しさん
20/12/18 13:23:30.53 2eIYLdZu.net
n要素のvectorをm要素に変えたいときって中身はどうでも良いって思ってれば
vec = vector<int>(m);

vec.assign(m);

vec.resize(m);
もコスト変わらない?

749:デフォルトの名無しさん
20/12/18 13:30:32.59 4UaQE5Dn.net
バグバグ言語ランキングで見事PHPに勝利!
URLリンク(www.techrepublic.com)

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化とかその辺をまずチェックでしょうさ。


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

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