1 名前:デフォルトの名無しさん mailto:sage [2020/01/31(金) 20:54:06.26 ID:Nt0XFA2s.net] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part147 https://mevius.5ch.net/test/read.cgi/tech/1576659413/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.105【環境依存OK】 mevius.5ch.net/test/read.cgi/tech/1556142878/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語)
846 名前:デフォルトの名無しさん mailto:sage [2020/02/13(木) 21:40:36.17 ID:sl9OX6cI.net] >>820 デストラクタの実装も、返ってきたアドレスの値でどのサイズの領域か(割り当て要求されたサイズではなく、自分で区切ったブロックのサイズ)が分かるようにしておけば大丈夫でないかな?
847 名前:デフォルトの名無しさん mailto:sage [2020/02/13(木) 21:41:24.98 ID:sl9OX6cI.net] >>822 すまん、勘違いでした。全部忘れてください
848 名前:デフォルトの名無しさん [2020/02/13(木) 22:02:22.87 ID:WjLTLikp.net] はい忘れました。
849 名前:デフォルトの名無しさん mailto:sage [2020/02/13(木) 22:06:16.93 ID:Bk3UL691.net] アドレスだけじゃなくて長さも受け渡しするインターフェースにしましょうとしか。
850 名前:デフォルトの名無しさん [2020/02/13(木) 22:36:33.13 ID:WjLTLikp.net] シリアル化の王道ってありますか?
851 名前:デフォルトの名無しさん mailto:sage [2020/02/13(木) 22:45:19.55 ID:iq5JxXln.net] オブジェクトならCORBA、データ構造だけでいいならASN.1とか。
852 名前:デフォルトの名無しさん mailto:sage [2020/02/13(Thu) 22:54:55 ID:tx2lxPGZ.net] >>822 TYPEがデストラクタを持つclassの場合に、ptr = new TYPE[n] で確保されたメモリ を delete[] ptr とすると、 正確に n 回デストラクタを呼び出す必要がある。 new が n * sizeof(TYPE) より大きめのブロックを確保した場合でも、 delete[] ptr 時に正確な n の値を割り出す方法が必要となる。 なので、n の値は ptr の値さえあれば知ることが出来ることが必要条件となる。 つまり、少なくともデストラクタを持つ TYPE の場合に TYPE の配列をヒープから 確保した場合には、配列の要素数を必ず配列の先頭のポインタの値から「知る」事が出来る。
853 名前:デフォルトの名無しさん [2020/02/13(Thu) 23:01:33 ID:WjLTLikp.net] >>827 もうちょっと簡単なのないですかね。 型情報要らないんで。
854 名前:デフォルトの名無しさん mailto:sage [2020/02/13(Thu) 23:09:58 ID:iq5JxXln.net] 型情報が無けりゃデシリアライズしても使いようがあるまい。
855 名前:デフォルトの名無しさん [2020/02/13(Thu) 23:12:32 ID:WjLTLikp.net] それがあるんですよ兄さん。
856 名前:デフォルトの名無しさん mailto:sage [2020/02/13(Thu) 23:12:57 ID:ktN45haN.net] 双方向mapって何使うのがいいですか?boostのbimap? それともこのくらいは自作してる人のほうが多いですか?
857 名前:デフォルトの名無しさん [2020/02/14(金) 00:05:24 ID:CPLKNT1n.net] 双方向Mapって何に使えるんですか?
858 名前:デフォルトの名無しさん mailto:sage [2020/02/14(金) 01:54:24 ID:0WgbwkuV.net] 型情報ないならそもそもデシリアライズできないし 型情報なしで成り立つ、つまり型情報を事前に知っている前提なら バイナリでそのまま送ればいいだろ
859 名前:デフォルトの名無しさん mailto:sage [2020/02/14(金) 02:05:36 ID:raWqkpxU.net] 型がわかっててもコンテナはそのままではバイナリで送れない
860 名前:デフォルトの名無しさん [2020/02/14(金) 02:11:15 ID:CPLKNT1n.net] >>834 そのやり方教えて。 あめさんあげるから。
861 名前:デフォルトの名無しさん mailto:sage [2020/02/14(金) 07:52:45.40 ID:RsXMnrpQ.net] ちゃんとやるならPODに詰め替えてからchar配列へreinterpret_cast
862 名前:はちみつ餃子 mailto:sage [2020/02/14(金) 09:19:01.22 ID:nLeEzkye.net] >>826 シリアル化ってのにどういう要件を置くかだな。 同じ環境でデシリアライズ出来ればよいのであれば >>837 で十分だろうし、 データ形式が決まってて (あるいはデータ形式の側を中心に策定したくて) それのシリアライズとデシリアライズを (それぞれ別の環境で (ときには言語も違うかも)) やりたいということなら protobuf などのツールを使うのはよい案だと思う。
863 名前:デフォルトの名無しさん mailto:sage [2020/02/14(金) 13:35:07 ID:vZZ7SPTm.net] boostにあるじゃないですか googleのなんか使うんじゃありません
864 名前:デフォルトの名無しさん [2020/02/14(金) 13:41:23 ID:a5iC3cHy.net] >>791 >>807 実装
865 名前:ヒ存だと思うけど hoge[-1] あたりに格納されてた [] [ここ壊れてます]
866 名前:デフォルトの名無しさん mailto:sage [2020/02/14(金) 13:49:57 ID:rQdJoGM9.net] >>840 VC++の場合、ptr = new TYPE[n] で確保された場合は、確かに ptr[0] == n になっていた気がする。 「確かに」というのは言葉のあやで、厳密には覚えてないが、 VC++の new で使われる組み込み関数のライブラリのソースコードを見ると分かる。
867 名前:デフォルトの名無しさん mailto:sage [2020/02/14(金) 13:50:28 ID:rQdJoGM9.net] >>841 すまん、 ptr[-1] == n の間違い。
868 名前:デフォルトの名無しさん [2020/02/14(金) 14:03:39 ID:a5iC3cHy.net] >>807 >>841 OSやコンパイラで違うんでしょ https://ideone.com/DuTmC5
869 名前:デフォルトの名無しさん mailto:sage [2020/02/14(金) 15:26:11.39 ID:rQdJoGM9.net] >>842 あ、すまん、正しくは、大体、 ((DWORD *)ptr)[-1] == n だ。 ptr[-1] だと、sizeof(TYPE)分、アドレスが戻ってしまうし、 結果の型も DWORD とかではなく、TYPE 型になってしまう。
870 名前:デフォルトの名無しさん mailto:sage [2020/02/14(金) 15:28:19.59 ID:rQdJoGM9.net] >>843 言っておくが、new char[n] とかでは、駄目な可能性は有るよ。 話は、「TYPEがデストラクタを持つとき」のnew TYPE[n]に限定。
871 名前:デフォルトの名無しさん mailto:sage [2020/02/14(金) 17:17:51.62 ID:jFoBh/u0.net] 一時オブジェクトの寿命について、ご教示ください。 例えば、以下のようなコードがあった時、 void foo(const char* c); // 外部ライブラリの関数につき変更不可とする void main() { const std::string s = "aaa"; foo((s + "bbb").c_str()); } 一時オブジェクトstring(s + "bbb")の破棄が行われるのは、 関数foo()を呼ぶ前でしょうか、呼んだ後でしょうか。 調べた範囲では、「完全式の終わり」という話が出てきたのですが、 どこまでが完全式なのか判断できませんでした。
872 名前:はちみつ餃子 mailto:sage [2020/02/14(金) 17:22:07.67 ID:nLeEzkye.net] >>846 この場合はその行の終わり。 セミコロンのところだと思っていい。
873 名前:はちみつ餃子 mailto:sage [2020/02/14(金) 17:34:07.49 ID:nLeEzkye.net] すごくどうでもいい話なんだけど、 JIS では完結式という用語を使ってるのに完全式って言葉の方がよく使われているよね……。
874 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/14(金) 17:59:01 ID:nLeEzkye.net] >>846-847 式の一部であるような式が部分式で、 そうでないような式が完結式って言う。
875 名前:デフォルトの名無しさん [2020/02/14(金) 19:29:16.13 ID:CPLKNT1n.net] >>837-838 ありがとん。
876 名前:846 mailto:sage [2020/02/14(金) 19:44:55.13 ID:jFoBh/u0.net] >>847-849 ご回答ありがとうございます。 大変勉強になりました。
877 名前:デフォルトの名無しさん mailto:sage [2020/02/14(金) 20:52:54 ID:x/oqiD9H.net] おいCぺろぺろ
878 名前:デフォルトの名無しさん mailto:sage [2020/02/14(金) 20:58:59 ID:V/oEZCXU.net] >>851 いえいえ
879 名前:デフォルトの名無しさん [2020/02/15(土) 10:34:21 ID:BMoFghq4.net] newって意外と速いんだな。 アクセスは不利かもしれないけど。
880 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 12:11:39.70 ID:DzNKB5Jj.net] >>854 速いよ。 高速なゲームでも普通に使える。
881 名前:デフォルトの名無しさん [2020/02/15(土) 12:12:59.04 ID:BMoFghq4.net] でもスタックは常にキャッシュに乗ってるから、そこらへんでどう変わるのかな。
882 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 13:19:54 ID:J1bovO5o.net] キャッシュに乗るくらいの量だったらそもそもクリティカルな重さにはならんだろ。 newで問題になるのは10万とかそのくらいのオーダーをがっつりfor文で呼ぶとかそれくらいのことする場合。
883 名前:デフォルトの名無しさん [2020/02/15(土) 13:21:27 ID:BMoFghq4.net] スタックは常にキャッシュに乗ってる。
884 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 13:23:13 ID:lTU5fwx1.net] >>857 風邪が騙りかけます
885 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 14:11:39.55 ID:DzNKB5Jj.net] >>857 VC++の場合、コンストラクタが無い場合、new が必要とする時間は 170クロック。 3.0GHz の CPUの場合、1.7 * 10^7 回(1,700万回)くらい new してやっと一秒 位。 だから、問題になるのは、1万回ループではなく、100〜1000万回くらいのループ。
886 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 14:15:19.79 ID:DzNKB5Jj.net] もちろん、スタック変数で済むならスタック変数の方がい
887 名前:い。 ただ、スタックは容量に限りがあるので全部スタックという訳にもいかない。 ヒープにも限りはあるにはあるが、それは OSやマシンの限界。 [] [ここ壊れてます]
888 名前:デフォルトの名無しさん [2020/02/15(土) 14:25:57.86 ID:BMoFghq4.net] そこでgotoなんですよ。
889 名前:デフォルトの名無しさん [2020/02/15(土) 14:43:25.87 ID:BMoFghq4.net] コレクションがソートの有無でだいぶ変わる。 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
890 名前:デフォルトの名無しさん [2020/02/15(土) 14:44:57.19 ID:BMoFghq4.net] 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
891 名前:デフォルトの名無しさん [2020/02/15(土) 14:46:37.02 ID:BMoFghq4.net] 挿入速度が変わるのは仕方ないとしても、検索速度が変わるのは、キャッシュじゃないかと思うんだけど。
892 名前:デフォルトの名無しさん [2020/02/15(土) 14:49:41.43 ID:BMoFghq4.net] std::sort: 306ms, (466551count). 先にソートしてから挿入したほうが速度的にお得っぽい。
893 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 16:03:09.29 ID:0hgUDlXi.net] >>854 速いといっても 単純な演算と比べれば劇遅
894 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 16:18:40.81 ID:qSK05WKV.net] >>867 とにかく、足し算/引き算が1クロック程度、new が170クロック程度だからね。 使い方を間違えなければ劇遅とはいえまい。
895 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 16:32:01.46 ID:4O8uAQVX.net] auto hentai = SM(std::move(羞恥心));
896 名前:デフォルトの名無しさん [2020/02/15(土) 17:12:18.08 ID:BMoFghq4.net] newより+のほうが速いってことか。
897 名前:デフォルトの名無しさん [2020/02/15(土) 17:25:57.34 ID:BMoFghq4.net] +と-ならどっちが速いんだろう。
898 名前:はちみつ餃子 mailto:sage [2020/02/15(土) 17:49:06.00 ID:cwLPNCdO.net] >>871 回路はほぼ共有してるんじゃないの? 2の補数を使うのもそれが理由なんだろうし。 少なくとも Pentium 時代まではクロックは同じだったはず。 近頃の事情は知らんけど GCC あたりで強い最適化をかけてみても引き算か足し算を特に避ける様子もないので、 まあだいたい同じなんでしょ。
899 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 18:01:50.38 ID:zARYy4pH.net] >>870 C++の場合、+ひとつだけでも裏でどんなコードが動くか油断ならない。
900 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 18:13:26.25 ID:2RWOAy2H.net] >>871 + と - で速度が違うCPUは見たことがない - は順番が関係あるので 処理によっては遅い事がある b = 1 + b b = 1 - b
901 名前:はちみつ餃子 mailto:sage [2020/02/15(土) 18:14:19.52 ID:cwLPNCdO.net] 整数だけの話じゃなくてってことか。 ある程度の常識的判断が出来る場合もあるけど、 基本的には実装次第だわな。
902 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 18:19:46.61 ID:2RWOAy2H.net] 組み込み型じゃなけりゃそりゃね + でミサイル発射とか
903 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 19:02:33.35 ID:qSK05WKV.net] >>870 new より + の方が 170 倍速いと言うことだ。
904 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 19:04:43.75 ID:cVttwiPD.net] >>874 一度bをnegateしてから足す処理系があるかもな
905 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 19:30:46 ID:qSK05WKV.net] >>874 確かに引き算には順序があるので、足し算より最適化に不利になることがある。
906 名前:デフォルトの名無しさん mailto:sage [2020/02/15(土) 19:48:11.00 ID:x3vECiAE.net] if(bReaZyuu){
907 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 00:34:55 ID:pXV6w9YM.net] if (false != bReaZyuu) {
908 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 00:35:58 ID:pXV6w9YM.net] newが常に数百クロックで済むと思ったら 間違いかもしれん…
909 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 01:50:35.50 ID:1DEBeg9G.net] 経験的にはnewが遅いと思ったことは無い。 なお、コンストラクタの処理時間以外はnewはmallocと同じ速度。 ゲームメーカーでも必要な場合に malloc を使うことは問題
910 名前:ネいとされている。 [] [ここ壊れてます]
911 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 02:03:13.40 ID:MPWqg8uW.net] new からしてmallocを呼んでる実装が多い気がする。
912 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 02:34:52 ID:yR2k1LO6.net] そりゃnew用とmalloc用でヒープ別けたら無駄だし
913 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/16(日) 02:36:27 ID:VK9AAsv4.net] ヒープからの割り付けをする機会を減らすことで実行速度を上げる工夫はよく聞く話ではあるよな。 ただ、そこまでギリギリのチューニングが必要ってことがあまりないだけで。
914 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 07:37:50.08 ID:Rlzwkt+8.net] newは最悪値が読めないからなぁ 組込とかシビアなゲームでは使い辛い
915 名前:デフォルトの名無しさん [2020/02/16(日) 08:25:44.50 ID:Yy7z+EdH.net] 具体的な数字が出てるとイメージが湧く。
916 名前:デフォルトの名無しさん [2020/02/16(日) 08:45:53 ID:Yy7z+EdH.net] 170クロックならあんまり気にする必要ないな。
917 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 10:26:07.87 ID:w0IbR+6u.net] 組み込みでc++がそもそもおかしい
918 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 11:00:34.43 ID:1DEBeg9G.net] >>887 よっぽどでない限り、AAAゲームでも使われてるよ。
919 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 11:01:02.59 ID:B02+i8yM.net] 最近では小規模組み込みでもC++を使う事はあります new / deleteやヒープを無効にしたり newのみでdelete出来ないようにしたり なんてこともあります
920 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 11:03:58.49 ID:+vprjU7s.net] >>890 視野狭すぎ
921 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 11:12:03 ID:w0IbR+6u.net] また馬鹿が無駄に一般化してできるワイ言ってんのか。。相変わらずだな。
922 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 11:20:41 ID:+vprjU7s.net] 日本語でおk
923 名前:デフォルトの名無しさん [2020/02/16(日) 11:23:16 ID:Yy7z+EdH.net] ストリームってなんで遅いんだろね。
924 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 11:39:47 ID:Rlzwkt+8.net] >>891 そりゃそういう例もあるわな だから何?w
925 名前:デフォルトの名無しさん [2020/02/16(日) 11:42:38 ID:Yy7z+EdH.net] スレで、do{}while()はダメっぽいこと書いてあったけど、なんでダメなの?
926 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 12:30:30 ID:q7JzY0gs.net] >>887 でもお前は組み込みにもゲーム開発にも携わってないじゃん
927 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 12:42:15 ID:Rlzwkt+8.net] >>899 ごめんねー、俺はプリンタ屋さんなのw ゲームは知り合いの話ね
928 名前:デフォルトの名無しさん [2020/02/16(日) 12:54:36 ID:Yy7z+EdH.net] プリンタ屋さんってどんな仕事ですか?
929 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 12:58:53 ID:Rlzwkt+8.net] >>901 俺は制御周り、上位インターフェースからのデータを描画ルーチンにに渡したり、下位インターフェースにデータ渡したり、パネルとかの制御をやってる 描画部分はまた別の人がやってる
930 名前:デフォルトの名無しさん [2020/02/16(日) 12:59:56.11 ID:Yy7z+EdH.net] なんか難しそうですね。
931 名前:デフォルトの名無しさん [2020/02/16(日) 13:01:18.53 ID:Yy7z+EdH.net] プリンタってプロセッサはどんな感じのを使うんですか? newってあるんですか?
932 名前:デフォルトの名無しさん [2020/02/16(日) 13:02:40.97 ID:Yy7z+EdH.net] プリンタのヘッドについてる穴の数は決まっているんだから、あまりヒープが必要無さそうな気もする。
933 名前:デフォルトの名無しさん [2020/02/16(日) 13:03:59.79 ID:Yy7z+EdH.net] std::vectorの上にヒープを作っても速度的に大丈夫なことは確認した。
934 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 13:07:31.29 ID:Rlzwkt+8.net] 昔はSHシリーズとかR2000とか 今はARMもそれなりに使ってる 制御だとnewは基本使わない あと俺がやってるのは業務用のLBP
935 名前:デフォルトの名無しさん [2020/02/16(日) 13:08:47.09 ID:Yy7z+EdH.net] ってことはキャノンですか。
936 名前:デフォルトの名無しさん [2020/02/16(日) 13:10:53.15 ID:Yy7z+EdH.net] メモ問題は結局ホワイトボード買ってきた。 ホワイトボードをワンノートに撮影するという昔っぽいことに。
937 名前:デフォルトの名無しさん mailto:sage [2020/02/16(日) 13:11:07.93 ID:Rlzwkt+8.net] 流石に社名までは出せんわw
938 名前:デフォルトの名無しさん [2020/02/16(日) 13:12:13.52 ID:Yy7z+EdH.net] ワンノートのアンドロイド版はカメラにホワイトボードのモードがあるんだけど、テカリ消してくれないし、ホワイトバランスも調整してくれない。
939 名前:はちみつ餃子 mailto:sage [2020/02/16(日) 13:12:31.37 ID:VK9AAsv4.net] PostScript くらいならプリンタの側で処理することもあるし、 世間で想像されているよりは高級なことをやっているんじゃないかなぁという気もする。
940 名前:デフォルトの名無しさん [2020/02/16(日) 13:16:21 ID:Yy7z+EdH.net] ってことは、別の人がnew使いまくり
941 名前:なのでは。 [] [ここ壊れてます]
942 名前:デフォルトの名無しさん [2020/02/16(日) 13:17:17 ID:Yy7z+EdH.net] テカテカしないホワイトボードないのかな。
943 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2020/02/16(日) 13:20:18 ID:VK9AAsv4.net] >>914 https://www.google.com/search?q=%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88%E3%83%9C%E3%83%BC%E3%83%89+%E3%83%9E%E3%83%83%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97
944 名前:デフォルトの名無しさん [2020/02/16(日) 13:20:51 ID:Yy7z+EdH.net] ありがとん。
945 名前:デフォルトの名無しさん [2020/02/16(日) 13:27:19 ID:Yy7z+EdH.net] モーター動かしたりするのはnew使ったらダメなんだろな。
946 名前:デフォルトの名無しさん [2020/02/16(日) 13:52:37.96 ID:Yy7z+EdH.net] リアルタイムOSはヒープあるんだろか。