C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part147
https://mevius.5ch.net/test/read.cgi/tech/1576659413/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://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/ (日本語)
探検
C++相談室 part148
■ このスレッドは過去ログ倉庫に格納されています
2020/01/31(金) 20:54:06.26ID:Nt0XFA2s
786デフォルトの名無しさん
2020/02/12(水) 21:52:54.99ID:DU9qWhLl >>778
マクロとtypedefが被った場合どうなるか解ってる?
マクロとtypedefが被った場合どうなるか解ってる?
787デフォルトの名無しさん
2020/02/12(水) 22:12:26.79ID:ecElmrkB もちろん
788デフォルトの名無しさん
2020/02/13(木) 00:16:13.58ID:X++L6urQ >>733
Rustを少し見てみたけど、書き方が全くC/C++とは違っていて、
全く異なる文化圏の言語になれた人が設計した臭がした。
これがC/C++の代替になるとは考えにくい。
はっきり行って、これを使えといわれると辛い。
Rustを少し見てみたけど、書き方が全くC/C++とは違っていて、
全く異なる文化圏の言語になれた人が設計した臭がした。
これがC/C++の代替になるとは考えにくい。
はっきり行って、これを使えといわれると辛い。
789デフォルトの名無しさん
2020/02/13(木) 00:26:27.60ID:YbJF2Pjt テスト機能が標準で用意されてるのはいい
790はちみつ餃子 ◆8X2XSCHEME
2020/02/13(木) 00:45:52.57ID:XX4mj9DD 個人的には Rust は好感触。
型システムは ML 系言語で実績があるものを基礎にしてることもあって、C++ のグダグダな歴史を背負ったものよりはまとも。
ML 系はやっぱり高級路線の言語だし、インデントでブロックを表す系統なのがしんどいけど、
Rust は上手く低レイヤ用 (としても使えるよう) に着地させてるし、 C 風の外観を踏襲してもいる。
C++ が Rust から取り入れられるものはそんなに多くないと思う。
C++ は良くも悪くも互換性についてかなり強い要求があるので、
Rust 的な、カッチリと保護された仕組みを後付けするのはどう考えても無理。
C++ が Rust を参考にすることは間違いなくあるとは思うが、
全体の思想がまるで違うので限定的な範囲でしか取り入れられない。
もし取り入れらたらそれは C++ の新機能として新しく学ぶので十分でしょ。
Rust を学ぶのは間違いなく有用ではあるけども、
Rust の知見が C++ に取り入れられる可能性がありそうだからという理由ならそんなに意味ない。
型システムは ML 系言語で実績があるものを基礎にしてることもあって、C++ のグダグダな歴史を背負ったものよりはまとも。
ML 系はやっぱり高級路線の言語だし、インデントでブロックを表す系統なのがしんどいけど、
Rust は上手く低レイヤ用 (としても使えるよう) に着地させてるし、 C 風の外観を踏襲してもいる。
C++ が Rust から取り入れられるものはそんなに多くないと思う。
C++ は良くも悪くも互換性についてかなり強い要求があるので、
Rust 的な、カッチリと保護された仕組みを後付けするのはどう考えても無理。
C++ が Rust を参考にすることは間違いなくあるとは思うが、
全体の思想がまるで違うので限定的な範囲でしか取り入れられない。
もし取り入れらたらそれは C++ の新機能として新しく学ぶので十分でしょ。
Rust を学ぶのは間違いなく有用ではあるけども、
Rust の知見が C++ に取り入れられる可能性がありそうだからという理由ならそんなに意味ない。
791デフォルトの名無しさん
2020/02/13(木) 01:02:46.91ID:b1nbpqgi C++の配列は長さの情報を持ってないってことになってるけど
長さを与えなくてもdelete[]できるんだから、メモリのどこかにその情報はあるよね?
なんでその情報をプログラマが利用できないようになってるの?
長さを与えなくてもdelete[]できるんだから、メモリのどこかにその情報はあるよね?
なんでその情報をプログラマが利用できないようになってるの?
792デフォルトの名無しさん
2020/02/13(木) 01:06:29.86ID:qzSQSiwu rustがかっちり保護してくれるとか低レイヤー向けとか馬鹿ほど信じてるよね。
ありゃ帯に短し襷に長しの典型言語だわ。
ありゃ帯に短し襷に長しの典型言語だわ。
793デフォルトの名無しさん
2020/02/13(木) 01:44:34.08ID:X++L6urQ >>792
実際、Rustは、Cを簡単にするのではなく、Cを難しくしてしまっていて、Cのポインタが理解できない or 難しく感じる人には、Rustの特徴の核心たる所有権、借用などの部分はちんぷんかんぷんだと思う。
実際、Rustは、Cを簡単にするのではなく、Cを難しくしてしまっていて、Cのポインタが理解できない or 難しく感じる人には、Rustの特徴の核心たる所有権、借用などの部分はちんぷんかんぷんだと思う。
794デフォルトの名無しさん
2020/02/13(木) 01:48:50.73ID:X++L6urQ >>793
Cの問題点を取り除いたと言うより、ほとんど全てのプログラミング言語が暗黙のうちに用いている代入の概念をなるべく使わないようにして変数束縛などの全く異なる独自概念を用いようとしている。
しかし、これは、手続き型言語と関数言語の違いに匹敵するくらいのプログラミングの概念の変更になってしまうため、手続き型言語の中で改良された次世代言語と言うものではなくなってしまっているとも言える。
Cの問題点を取り除いたと言うより、ほとんど全てのプログラミング言語が暗黙のうちに用いている代入の概念をなるべく使わないようにして変数束縛などの全く異なる独自概念を用いようとしている。
しかし、これは、手続き型言語と関数言語の違いに匹敵するくらいのプログラミングの概念の変更になってしまうため、手続き型言語の中で改良された次世代言語と言うものではなくなってしまっているとも言える。
795デフォルトの名無しさん
2020/02/13(木) 05:24:36.37ID:AWnkBPoe 変数束縛って右辺値参照でしょ
796デフォルトの名無しさん
2020/02/13(木) 06:24:47.58ID:fMXzK7Sc RustはC++なら簡単にできることをものすごく回りくどく書かないとコンパイル通らない感じだからとてもつらい
797デフォルトの名無しさん
2020/02/13(木) 09:13:38.23ID:6FSFTWhE798デフォルトの名無しさん
2020/02/13(木) 12:35:22.33ID:z5cRWLgY >>797
断言してもいいが、RustはC++に取って代わることは無い。
なぜなら、普通の手続き型言語での枠組みにすら入ってない書き方を強要されるから。
手短に言えば、単にC/C++と書き方が大幅に違っているだけではなく、書き方が他のどんな減の範疇にも属していない。
断言してもいいが、RustはC++に取って代わることは無い。
なぜなら、普通の手続き型言語での枠組みにすら入ってない書き方を強要されるから。
手短に言えば、単にC/C++と書き方が大幅に違っているだけではなく、書き方が他のどんな減の範疇にも属していない。
799はちみつ餃子 ◆8X2XSCHEME
2020/02/13(木) 13:30:24.18ID:XX4mj9DD >>796
C/C++ でのオブジェクトの寿命の管理の難しさってのは
理屈が理解しづらいというよりはわかってても間違うという難しさなんだよね。
そして間違っていてもコンパイラは黙って通すことも多い。
C/C++ を長く使っていればそれを感じることって結構あるでしょ。
そういう部分のプログラムが正しいことはプログラマが保証しなくてはならんわけだ。
でも Rust では言語処理系の側でやってくれる。
C/C++ で面倒な部分を Rust では自動でやってくれる。
まわりくどいのは確かだけど、それで楽できるのも確かなので、
どっちを取るかって話だな。
オブジェクトをどこで後始末するか。
管理の主導権はどのモジュールに持たせるか。
そういうのって C/C++ でも考えてるよね。
C/C++ ではプログラムに書いてないだけで本来はあるはずのものなんだよ。
(C++ だとスマートポインタの導入で少し楽にはなったけど。)
自分が何を考えていたのか、そして何を考えられていなかったのが
明らかになるのはそれはそれで楽しいと思う。
まあ、それは俺が趣味でやってるからかもしれんな。
C/C++ でのオブジェクトの寿命の管理の難しさってのは
理屈が理解しづらいというよりはわかってても間違うという難しさなんだよね。
そして間違っていてもコンパイラは黙って通すことも多い。
C/C++ を長く使っていればそれを感じることって結構あるでしょ。
そういう部分のプログラムが正しいことはプログラマが保証しなくてはならんわけだ。
でも Rust では言語処理系の側でやってくれる。
C/C++ で面倒な部分を Rust では自動でやってくれる。
まわりくどいのは確かだけど、それで楽できるのも確かなので、
どっちを取るかって話だな。
オブジェクトをどこで後始末するか。
管理の主導権はどのモジュールに持たせるか。
そういうのって C/C++ でも考えてるよね。
C/C++ ではプログラムに書いてないだけで本来はあるはずのものなんだよ。
(C++ だとスマートポインタの導入で少し楽にはなったけど。)
自分が何を考えていたのか、そして何を考えられていなかったのが
明らかになるのはそれはそれで楽しいと思う。
まあ、それは俺が趣味でやってるからかもしれんな。
800デフォルトの名無しさん
2020/02/13(木) 13:34:58.25ID:3lSBa444 おまえの設計がヘタクソなだけだろ
801はちみつ餃子 ◆8X2XSCHEME
2020/02/13(木) 13:45:30.52ID:XX4mj9DD802デフォルトの名無しさん
2020/02/13(木) 14:01:13.64ID:z5cRWLgY803はちみつ餃子 ◆8X2XSCHEME
2020/02/13(木) 14:13:53.49ID:XX4mj9DD >>802
間違いなくミスし易いけどミスした箇所が検出できないということはあまりない。
間違いなくミスし易いけどミスした箇所が検出できないということはあまりない。
804デフォルトの名無しさん
2020/02/13(木) 14:20:14.02ID:3lSBa444 設計がヘタクソなヤツが書いたソースのメンテやらされるのは最悪だけど自分で組み上げるならC++以外有り得ない
各々の力量が顕著に表れやすい最高の言語には違いない
バカも容易に炙り出せるしな
各々の力量が顕著に表れやすい最高の言語には違いない
バカも容易に炙り出せるしな
805デフォルトの名無しさん
2020/02/13(木) 14:20:33.11ID:z5cRWLgY >>803
仮にあなたはちゃんと理解できても、一般のプログラマは変数束縛やら所有権や借用の概念を理解することが難しすぎるので、C/C++を置き換える言語にはならない。
それらの概念は学習コストが高すぎるどころか、一生理解できないプログラマが多いだろう。
仮にあなたはちゃんと理解できても、一般のプログラマは変数束縛やら所有権や借用の概念を理解することが難しすぎるので、C/C++を置き換える言語にはならない。
それらの概念は学習コストが高すぎるどころか、一生理解できないプログラマが多いだろう。
806はちみつ餃子 ◆8X2XSCHEME
2020/02/13(木) 15:53:13.34ID:XX4mj9DD >>805
誤解のないように補足しておくけど、俺は Rust が C++ を置き換えるという主張はしてないからね。
C++ の重大な欠点を (実行コストをあまり払わない形で) 改善しているのは確かってだけ。
そんでもってそれが必要な場面は間違いなくあるってことも。
誤解のないように補足しておくけど、俺は Rust が C++ を置き換えるという主張はしてないからね。
C++ の重大な欠点を (実行コストをあまり払わない形で) 改善しているのは確かってだけ。
そんでもってそれが必要な場面は間違いなくあるってことも。
807デフォルトの名無しさん
2020/02/13(木) 19:21:34.29ID:b1nbpqgi >>791
わかる人いませんか?
わかる人いませんか?
808デフォルトの名無しさん
2020/02/13(木) 19:29:34.59ID:z5cRWLgY >>807
new TYPE[] のようにしてヒープから配列として確保されたメモリは確かに
要素数の情報を持っている。
しかし、new TYPEのように配列ではない場合は、高速化のために情報を
持ってない処理系もある。そのために 前者では delete[] を、後者では
deleteを使うことになっており、間違った組み合わせを使った場合には
不具合を生じる。
また、ポインタは、ヒープから確保された配列ばかりをポイントしているとは
限らず、例えばスタック上のローカルオート変数や、グローバル変数をポイント
していることもあり、その場合には、要素数の情報は全く持っていない。
さらに、Cの場合、関数の引数に TYPE buf[] のように配列を書いても、
TYPE *buf に自動修正される仕様となっている。
そのため、配列を受け取るのは、必ずポインタということになる。
しかし、ポインタで受け取るということは、そこには、&a のように、
ローカルオート変数も実引数として指定して呼び出すことも出来る。
その場合には要素数が無いので、あなたの望みをかなえる高速な
一般的方法が存在しない。
望みをかなえるためには、言語の拡張が必要となる。
new TYPE[] のようにしてヒープから配列として確保されたメモリは確かに
要素数の情報を持っている。
しかし、new TYPEのように配列ではない場合は、高速化のために情報を
持ってない処理系もある。そのために 前者では delete[] を、後者では
deleteを使うことになっており、間違った組み合わせを使った場合には
不具合を生じる。
また、ポインタは、ヒープから確保された配列ばかりをポイントしているとは
限らず、例えばスタック上のローカルオート変数や、グローバル変数をポイント
していることもあり、その場合には、要素数の情報は全く持っていない。
さらに、Cの場合、関数の引数に TYPE buf[] のように配列を書いても、
TYPE *buf に自動修正される仕様となっている。
そのため、配列を受け取るのは、必ずポインタということになる。
しかし、ポインタで受け取るということは、そこには、&a のように、
ローカルオート変数も実引数として指定して呼び出すことも出来る。
その場合には要素数が無いので、あなたの望みをかなえる高速な
一般的方法が存在しない。
望みをかなえるためには、言語の拡張が必要となる。
809デフォルトの名無しさん
2020/02/13(木) 19:33:05.83ID:bRhYdbIA Rustっていろいろ清々しいよね
関数型言語に必須じゃねえのと思うリスト関係がぽっかり抜けてるのは不満だけど
関数型言語に必須じゃねえのと思うリスト関係がぽっかり抜けてるのは不満だけど
810デフォルトの名無しさん
2020/02/13(木) 19:57:05.87ID:WjLTLikp811デフォルトの名無しさん
2020/02/13(木) 20:01:17.55ID:b1nbpqgi812デフォルトの名無しさん
2020/02/13(木) 20:08:49.19ID:J94ypinO delete [] pと同じように
sizeof [] pを用意すりゃいいのにね
pがnew []されてなかったら誤動作するって挙動ならdeleteと同じだろうに
sizeof [] pを用意すりゃいいのにね
pがnew []されてなかったら誤動作するって挙動ならdeleteと同じだろうに
813デフォルトの名無しさん
2020/02/13(木) 20:15:32.26ID:iivZofrB 言いたいことは分かるが構文がきもい
814デフォルトの名無しさん
2020/02/13(木) 20:17:34.65ID:Y6SS1xK+ 欲しいなら作れば?
それができるのがc++じゃん
それができるのがc++じゃん
>>791
>C++の配列は長さの情報を持ってないってことになってるけど
>長さを与えなくてもdelete[]できるんだから、メモリのどこかにその情報はあるよね?
new したときは、その領域サイズが実行時にユーザーのみえないところに保存される、というだけなのでは?
C/C++ の配列は長さ情報を(自分でそう書かないかぎり)持たないとおもいますよ
>C++の配列は長さの情報を持ってないってことになってるけど
>長さを与えなくてもdelete[]できるんだから、メモリのどこかにその情報はあるよね?
new したときは、その領域サイズが実行時にユーザーのみえないところに保存される、というだけなのでは?
C/C++ の配列は長さ情報を(自分でそう書かないかぎり)持たないとおもいますよ
816デフォルトの名無しさん
2020/02/13(木) 20:38:39.62ID:WjLTLikp ちゃうねん。
817デフォルトの名無しさん
2020/02/13(木) 20:50:05.52ID:qzSQSiwu 設計がダメな場合コンパイラにいくら指摘されようと根本的には治らんのだが、
(たいていそういう馬鹿はコンパイラ通すためにmut,RefCell,unsafeを使いまくる)
そういうのを少しもわかってないバカがrust推しなんだよなぁ。
構造体を1から作り直さなきゃならんかったり根本的に間違ってる。
(たいていそういう馬鹿はコンパイラ通すためにmut,RefCell,unsafeを使いまくる)
そういうのを少しもわかってないバカがrust推しなんだよなぁ。
構造体を1から作り直さなきゃならんかったり根本的に間違ってる。
818デフォルトの名無しさん
2020/02/13(木) 21:00:18.27ID:sl9OX6cI >>808
new TYPE[]するとき内部的にサイズ情報を持つ保証ってあったっけ?
例えば自前でoperator new []を実装するとき、予め2^nバイトのブロックを所定の数用意しておいて、要求サイズに応じて必要十分な大きさのブロックを返すなら、割り当て時に要求されたバイト数または要素数の情報を保持しないという実装も可能かと思う。
new TYPE[]するとき内部的にサイズ情報を持つ保証ってあったっけ?
例えば自前でoperator new []を実装するとき、予め2^nバイトのブロックを所定の数用意しておいて、要求サイズに応じて必要十分な大きさのブロックを返すなら、割り当て時に要求されたバイト数または要素数の情報を保持しないという実装も可能かと思う。
819デフォルトの名無しさん
2020/02/13(木) 21:18:32.64ID:9NIgZq2/ >>811
いえいえ
いえいえ
820デフォルトの名無しさん
2020/02/13(木) 21:37:18.24ID:Y6SS1xK+ >>818
デストラクタ呼ぶ必要ある
デストラクタ呼ぶ必要ある
821デフォルトの名無しさん
2020/02/13(木) 21:39:24.09ID:J94ypinO デストラクタ呼ぶ必要ない型だと、size情報持ってないと言うことなんだろうね
822デフォルトの名無しさん
2020/02/13(木) 21:40:36.17ID:sl9OX6cI >>820
デストラクタの実装も、返ってきたアドレスの値でどのサイズの領域か(割り当て要求されたサイズではなく、自分で区切ったブロックのサイズ)が分かるようにしておけば大丈夫でないかな?
デストラクタの実装も、返ってきたアドレスの値でどのサイズの領域か(割り当て要求されたサイズではなく、自分で区切ったブロックのサイズ)が分かるようにしておけば大丈夫でないかな?
823デフォルトの名無しさん
2020/02/13(木) 21:41:24.98ID:sl9OX6cI >>822
すまん、勘違いでした。全部忘れてください
すまん、勘違いでした。全部忘れてください
824デフォルトの名無しさん
2020/02/13(木) 22:02:22.87ID:WjLTLikp はい忘れました。
825デフォルトの名無しさん
2020/02/13(木) 22:06:16.93ID:Bk3UL691 アドレスだけじゃなくて長さも受け渡しするインターフェースにしましょうとしか。
826デフォルトの名無しさん
2020/02/13(木) 22:36:33.13ID:WjLTLikp シリアル化の王道ってありますか?
827デフォルトの名無しさん
2020/02/13(木) 22:45:19.55ID:iq5JxXln オブジェクトならCORBA、データ構造だけでいいならASN.1とか。
828デフォルトの名無しさん
2020/02/13(木) 22:54:55.06ID:tx2lxPGZ >>822
TYPEがデストラクタを持つclassの場合に、ptr = new TYPE[n] で確保されたメモリ
を delete[] ptr とすると、 正確に n 回デストラクタを呼び出す必要がある。
new が n * sizeof(TYPE) より大きめのブロックを確保した場合でも、
delete[] ptr 時に正確な n の値を割り出す方法が必要となる。
なので、n の値は ptr の値さえあれば知ることが出来ることが必要条件となる。
つまり、少なくともデストラクタを持つ TYPE の場合に TYPE の配列をヒープから
確保した場合には、配列の要素数を必ず配列の先頭のポインタの値から「知る」事が出来る。
TYPEがデストラクタを持つclassの場合に、ptr = new TYPE[n] で確保されたメモリ
を delete[] ptr とすると、 正確に n 回デストラクタを呼び出す必要がある。
new が n * sizeof(TYPE) より大きめのブロックを確保した場合でも、
delete[] ptr 時に正確な n の値を割り出す方法が必要となる。
なので、n の値は ptr の値さえあれば知ることが出来ることが必要条件となる。
つまり、少なくともデストラクタを持つ TYPE の場合に TYPE の配列をヒープから
確保した場合には、配列の要素数を必ず配列の先頭のポインタの値から「知る」事が出来る。
829デフォルトの名無しさん
2020/02/13(木) 23:01:33.00ID:WjLTLikp830デフォルトの名無しさん
2020/02/13(木) 23:09:58.23ID:iq5JxXln 型情報が無けりゃデシリアライズしても使いようがあるまい。
831デフォルトの名無しさん
2020/02/13(木) 23:12:32.63ID:WjLTLikp それがあるんですよ兄さん。
832デフォルトの名無しさん
2020/02/13(木) 23:12:57.71ID:ktN45haN 双方向mapって何使うのがいいですか?boostのbimap?
それともこのくらいは自作してる人のほうが多いですか?
それともこのくらいは自作してる人のほうが多いですか?
833デフォルトの名無しさん
2020/02/14(金) 00:05:24.00ID:CPLKNT1n 双方向Mapって何に使えるんですか?
834デフォルトの名無しさん
2020/02/14(金) 01:54:24.23ID:0WgbwkuV 型情報ないならそもそもデシリアライズできないし
型情報なしで成り立つ、つまり型情報を事前に知っている前提なら
バイナリでそのまま送ればいいだろ
型情報なしで成り立つ、つまり型情報を事前に知っている前提なら
バイナリでそのまま送ればいいだろ
835デフォルトの名無しさん
2020/02/14(金) 02:05:36.33ID:raWqkpxU 型がわかっててもコンテナはそのままではバイナリで送れない
836デフォルトの名無しさん
2020/02/14(金) 02:11:15.54ID:CPLKNT1n837デフォルトの名無しさん
2020/02/14(金) 07:52:45.40ID:RsXMnrpQ ちゃんとやるならPODに詰め替えてからchar配列へreinterpret_cast
838はちみつ餃子 ◆8X2XSCHEME
2020/02/14(金) 09:19:01.22ID:nLeEzkye839デフォルトの名無しさん
2020/02/14(金) 13:35:07.90ID:vZZ7SPTm boostにあるじゃないですか
googleのなんか使うんじゃありません
googleのなんか使うんじゃありません
841デフォルトの名無しさん
2020/02/14(金) 13:49:57.91ID:rQdJoGM9 >>840
VC++の場合、ptr = new TYPE[n] で確保された場合は、確かに
ptr[0] == n
になっていた気がする。
「確かに」というのは言葉のあやで、厳密には覚えてないが、
VC++の new で使われる組み込み関数のライブラリのソースコードを見ると分かる。
VC++の場合、ptr = new TYPE[n] で確保された場合は、確かに
ptr[0] == n
になっていた気がする。
「確かに」というのは言葉のあやで、厳密には覚えてないが、
VC++の new で使われる組み込み関数のライブラリのソースコードを見ると分かる。
842デフォルトの名無しさん
2020/02/14(金) 13:50:28.63ID:rQdJoGM9843デフォルトの名無しさん
2020/02/14(金) 14:03:39.33ID:a5iC3cHy844デフォルトの名無しさん
2020/02/14(金) 15:26:11.39ID:rQdJoGM9 >>842
あ、すまん、正しくは、大体、
((DWORD *)ptr)[-1] == n
だ。
ptr[-1] だと、sizeof(TYPE)分、アドレスが戻ってしまうし、
結果の型も DWORD とかではなく、TYPE 型になってしまう。
あ、すまん、正しくは、大体、
((DWORD *)ptr)[-1] == n
だ。
ptr[-1] だと、sizeof(TYPE)分、アドレスが戻ってしまうし、
結果の型も DWORD とかではなく、TYPE 型になってしまう。
845デフォルトの名無しさん
2020/02/14(金) 15:28:19.59ID:rQdJoGM9846デフォルトの名無しさん
2020/02/14(金) 17:17:51.62ID:jFoBh/u0 一時オブジェクトの寿命について、ご教示ください。
例えば、以下のようなコードがあった時、
void foo(const char* c); // 外部ライブラリの関数につき変更不可とする
void main()
{
const std::string s = "aaa";
foo((s + "bbb").c_str());
}
一時オブジェクトstring(s + "bbb")の破棄が行われるのは、
関数foo()を呼ぶ前でしょうか、呼んだ後でしょうか。
調べた範囲では、「完全式の終わり」という話が出てきたのですが、
どこまでが完全式なのか判断できませんでした。
例えば、以下のようなコードがあった時、
void foo(const char* c); // 外部ライブラリの関数につき変更不可とする
void main()
{
const std::string s = "aaa";
foo((s + "bbb").c_str());
}
一時オブジェクトstring(s + "bbb")の破棄が行われるのは、
関数foo()を呼ぶ前でしょうか、呼んだ後でしょうか。
調べた範囲では、「完全式の終わり」という話が出てきたのですが、
どこまでが完全式なのか判断できませんでした。
848はちみつ餃子 ◆8X2XSCHEME
2020/02/14(金) 17:34:07.49ID:nLeEzkye すごくどうでもいい話なんだけど、
JIS では完結式という用語を使ってるのに完全式って言葉の方がよく使われているよね……。
JIS では完結式という用語を使ってるのに完全式って言葉の方がよく使われているよね……。
849はちみつ餃子 ◆8X2XSCHEME
2020/02/14(金) 17:59:01.70ID:nLeEzkye850デフォルトの名無しさん
2020/02/14(金) 19:29:16.13ID:CPLKNT1n >>837-838
ありがとん。
ありがとん。
852デフォルトの名無しさん
2020/02/14(金) 20:52:54.21ID:x/oqiD9H おいCぺろぺろ
853デフォルトの名無しさん
2020/02/14(金) 20:58:59.55ID:V/oEZCXU >>851
いえいえ
いえいえ
854デフォルトの名無しさん
2020/02/15(土) 10:34:21.20ID:BMoFghq4 newって意外と速いんだな。
アクセスは不利かもしれないけど。
アクセスは不利かもしれないけど。
855デフォルトの名無しさん
2020/02/15(土) 12:11:39.70ID:DzNKB5Jj856デフォルトの名無しさん
2020/02/15(土) 12:12:59.04ID:BMoFghq4 でもスタックは常にキャッシュに乗ってるから、そこらへんでどう変わるのかな。
857デフォルトの名無しさん
2020/02/15(土) 13:19:54.61ID:J1bovO5o キャッシュに乗るくらいの量だったらそもそもクリティカルな重さにはならんだろ。
newで問題になるのは10万とかそのくらいのオーダーをがっつりfor文で呼ぶとかそれくらいのことする場合。
newで問題になるのは10万とかそのくらいのオーダーをがっつりfor文で呼ぶとかそれくらいのことする場合。
858デフォルトの名無しさん
2020/02/15(土) 13:21:27.11ID:BMoFghq4 スタックは常にキャッシュに乗ってる。
859デフォルトの名無しさん
2020/02/15(土) 13:23:13.35ID:lTU5fwx1 >>857
風邪が騙りかけます
風邪が騙りかけます
860デフォルトの名無しさん
2020/02/15(土) 14:11:39.55ID:DzNKB5Jj >>857
VC++の場合、コンストラクタが無い場合、new が必要とする時間は 170クロック。
3.0GHz の CPUの場合、1.7 * 10^7 回(1,700万回)くらい new してやっと一秒
位。
だから、問題になるのは、1万回ループではなく、100〜1000万回くらいのループ。
VC++の場合、コンストラクタが無い場合、new が必要とする時間は 170クロック。
3.0GHz の CPUの場合、1.7 * 10^7 回(1,700万回)くらい new してやっと一秒
位。
だから、問題になるのは、1万回ループではなく、100〜1000万回くらいのループ。
861デフォルトの名無しさん
2020/02/15(土) 14:15:19.79ID:DzNKB5Jj もちろん、スタック変数で済むならスタック変数の方がいい。
ただ、スタックは容量に限りがあるので全部スタックという訳にもいかない。
ヒープにも限りはあるにはあるが、それは OSやマシンの限界。
ただ、スタックは容量に限りがあるので全部スタックという訳にもいかない。
ヒープにも限りはあるにはあるが、それは OSやマシンの限界。
862デフォルトの名無しさん
2020/02/15(土) 14:25:57.86ID:BMoFghq4 そこでgotoなんですよ。
863デフォルトの名無しさん
2020/02/15(土) 14:43:25.87ID:BMoFghq4 コレクションがソートの有無でだいぶ変わる。
trie_base_benchmark__sorted_words_1
trie assign.
409ms
size : 466551
words : 466551
trie insert.
762ms
size : 466551
words : 466551
std::set insert.
69ms
std::unordered_set insert.
149ms
(assigned) trie find.
24ms
(inserted) trie find.
25ms
std::set find.
194ms
std::unordered_set find.
63ms
trie_base_benchmark__sorted_words_1
trie assign.
409ms
size : 466551
words : 466551
trie insert.
762ms
size : 466551
words : 466551
std::set insert.
69ms
std::unordered_set insert.
149ms
(assigned) trie find.
24ms
(inserted) trie find.
25ms
std::set find.
194ms
std::unordered_set find.
63ms
864デフォルトの名無しさん
2020/02/15(土) 14:44:57.19ID:BMoFghq4 trie_base_benchmark__random_words_1
trie assign.
2034ms
size : 466551
words : 466551
trie insert.
2026ms
size : 466551
words : 466551
std::set insert.
490ms
std::unordered_set insert.
146ms
(assigned) trie find.
158ms
(inserted) trie find.
169ms
std::set find.
477ms
std::unordered_set find.
62ms
trie assign.
2034ms
size : 466551
words : 466551
trie insert.
2026ms
size : 466551
words : 466551
std::set insert.
490ms
std::unordered_set insert.
146ms
(assigned) trie find.
158ms
(inserted) trie find.
169ms
std::set find.
477ms
std::unordered_set find.
62ms
865デフォルトの名無しさん
2020/02/15(土) 14:46:37.02ID:BMoFghq4 挿入速度が変わるのは仕方ないとしても、検索速度が変わるのは、キャッシュじゃないかと思うんだけど。
866デフォルトの名無しさん
2020/02/15(土) 14:49:41.43ID:BMoFghq4 std::sort: 306ms, (466551count).
先にソートしてから挿入したほうが速度的にお得っぽい。
先にソートしてから挿入したほうが速度的にお得っぽい。
867デフォルトの名無しさん
2020/02/15(土) 16:03:09.29ID:0hgUDlXi868デフォルトの名無しさん
2020/02/15(土) 16:18:40.81ID:qSK05WKV869デフォルトの名無しさん
2020/02/15(土) 16:32:01.46ID:4O8uAQVX auto hentai = SM(std::move(羞恥心));
870デフォルトの名無しさん
2020/02/15(土) 17:12:18.08ID:BMoFghq4 newより+のほうが速いってことか。
871デフォルトの名無しさん
2020/02/15(土) 17:25:57.34ID:BMoFghq4 +と-ならどっちが速いんだろう。
872はちみつ餃子 ◆8X2XSCHEME
2020/02/15(土) 17:49:06.00ID:cwLPNCdO >>871
回路はほぼ共有してるんじゃないの?
2の補数を使うのもそれが理由なんだろうし。
少なくとも Pentium 時代まではクロックは同じだったはず。
近頃の事情は知らんけど
GCC あたりで強い最適化をかけてみても引き算か足し算を特に避ける様子もないので、
まあだいたい同じなんでしょ。
回路はほぼ共有してるんじゃないの?
2の補数を使うのもそれが理由なんだろうし。
少なくとも Pentium 時代まではクロックは同じだったはず。
近頃の事情は知らんけど
GCC あたりで強い最適化をかけてみても引き算か足し算を特に避ける様子もないので、
まあだいたい同じなんでしょ。
873デフォルトの名無しさん
2020/02/15(土) 18:01:50.38ID:zARYy4pH >>870
C++の場合、+ひとつだけでも裏でどんなコードが動くか油断ならない。
C++の場合、+ひとつだけでも裏でどんなコードが動くか油断ならない。
874デフォルトの名無しさん
2020/02/15(土) 18:13:26.25ID:2RWOAy2H875はちみつ餃子 ◆8X2XSCHEME
2020/02/15(土) 18:14:19.52ID:cwLPNCdO 整数だけの話じゃなくてってことか。
ある程度の常識的判断が出来る場合もあるけど、
基本的には実装次第だわな。
ある程度の常識的判断が出来る場合もあるけど、
基本的には実装次第だわな。
876デフォルトの名無しさん
2020/02/15(土) 18:19:46.61ID:2RWOAy2H 組み込み型じゃなけりゃそりゃね
+ でミサイル発射とか
+ でミサイル発射とか
877デフォルトの名無しさん
2020/02/15(土) 19:02:33.35ID:qSK05WKV >>870
new より + の方が 170 倍速いと言うことだ。
new より + の方が 170 倍速いと言うことだ。
878デフォルトの名無しさん
2020/02/15(土) 19:04:43.75ID:cVttwiPD >>874
一度bをnegateしてから足す処理系があるかもな
一度bをnegateしてから足す処理系があるかもな
879デフォルトの名無しさん
2020/02/15(土) 19:30:46.15ID:qSK05WKV >>874
確かに引き算には順序があるので、足し算より最適化に不利になることがある。
確かに引き算には順序があるので、足し算より最適化に不利になることがある。
880デフォルトの名無しさん
2020/02/15(土) 19:48:11.00ID:x3vECiAE if(bReaZyuu){
881デフォルトの名無しさん
2020/02/16(日) 00:34:55.37ID:pXV6w9YM if (false != bReaZyuu) {
882デフォルトの名無しさん
2020/02/16(日) 00:35:58.12ID:pXV6w9YM newが常に数百クロックで済むと思ったら
間違いかもしれん…
間違いかもしれん…
883デフォルトの名無しさん
2020/02/16(日) 01:50:35.50ID:1DEBeg9G 経験的にはnewが遅いと思ったことは無い。
なお、コンストラクタの処理時間以外はnewはmallocと同じ速度。
ゲームメーカーでも必要な場合に malloc を使うことは問題ないとされている。
なお、コンストラクタの処理時間以外はnewはmallocと同じ速度。
ゲームメーカーでも必要な場合に malloc を使うことは問題ないとされている。
884デフォルトの名無しさん
2020/02/16(日) 02:03:13.40ID:MPWqg8uW new からしてmallocを呼んでる実装が多い気がする。
885デフォルトの名無しさん
2020/02/16(日) 02:34:52.46ID:yR2k1LO6 そりゃnew用とmalloc用でヒープ別けたら無駄だし
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- バリ島で男子生徒ら集団万引きか、防犯カメラ映像が拡散 京都の大谷中学・高校が「窃盗行為」謝罪★4 [七波羅探題★]
- 中国軍機レーダー照射、トランプ氏沈黙突く 試される日本外交 [蚤の市★]
- 【地震】青森県で震度6強 長周期地震動も 津波注意報すべて解除 ★7 [ぐれ★] [ぐれ★]
- トランプ大統領 エヌビディア製AI半導体の中国輸出許可 安全保障重視の方針転換 [蚤の市★]
- 【広島】「万引きした人を追跡」コンビニ店員の男性(46)を果物ナイフで刺したか 中国籍の少年(17)を殺人未遂容疑で現行犯逮捕 [ぐれ★]
- 【サッカー】58歳カズ「オファーが来ている」 J3福島と近日中にも交渉 早ければ年内にも決断 [征夷大将軍★]
- 気象庁・高市内閣「この後311級の地震の可能性があります。北海道〜関東の人は1週間は地震が来てもすぐ逃げられる格好をしてください」 [597533159]
- 【動画】ファッションモデルまんこ、裸でランウェイを歩く。これがファッションだと言われて [749674962]
- 【悲報】高市早苗の擬人化がXで大バズりwwwwwwwwwwww [455031798]
- バリ島で万引きした高校生が叩かれているけどさ
- 早大名誉教授「高市内閣の高支持率はデータ操作か、支持している日本人がアホなのか」👈核心を突いてしまう [868050967]
- こんぺこ!こんぺこ!こんぺこ!🐰🏡
