1 名前:デフォルトの名無しさん [2018/08/27(月) 16:02:00.94 ID:vY3QDx2y0.net] 次スレを立てる時は本文の1行目に以下を追加して下さい。 !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part137 https://mevius.5ch.net/test/read.cgi/tech/1531558382/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.103【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1530384293/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) ----- テンプレ ここまで ----- VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
202 名前:はちみつ餃子 mailto:sage [2018/09/04(火) 00:37:21.78 ID:f5HJ/2BD0.net] >>195 > 異なるスレッドから集中してビットをオンしまくる、ということをして矛盾が発生することはありますか? 矛盾というのがどういう状況を想定しているのかわからないけど、 言語仕様上はデータ競合が起こりうると解釈できる場面だと思う。 要するに未定義動作に突入する可能性がある。 mutex でロックすることで簡単に回避は出来るが速度を考えるならば 操作するデータが atomic であるようにデザインするとなんとかなるかも? > biset や vector<bool> というのは、一つの物理バイトに対して複数の bool を詰め込んだ作りとして実装されているのでしょうか? される。 > bitset[index] = boolean, > とか > vector[index] = boolean > (operator[] が「bool の参照」?を返す、みたいな感じ) は実際にはどのように記述されているのでしょうか? 「1 ビットを表す型」のオブジェクトを返すことで対応する。 そのせいで、 std::vector<bool> は bool 以外を格納する std::vector よりも出来ることに若干の制約がある。
203 名前:はちみつ餃子 mailto:sage [2018/09/04(火) 03:10:23.32 ID:f5HJ/2BD0.net] テトリスの素材を用意したぞ https://dotup.org/uploda/dotup.org1633818.png
204 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 05:42:55.53 ID:4a01gUXa0.net] 惜しい、もうちょっと工夫すれば 「テトリス」だけでなく「○○トリス」としても使えるのに。
205 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 06:42:41.96 ID:Nt/zN6W10.net] https://i.imgur.com/HPUz3hy.gif むぅ…
206 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 07:24:16.79 ID:FJBPHmlLM.net] >>195 アーキ依存だが、同一バイトアライメントを参照しない限り問題ないってエロい先輩が言ってた 大人しくmutexつかえ、mutexのコストよりスレッド切り替えのコストを気にしろ、とも言われた
207 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 09:34:15.28 ID:W1MTXd47M.net] >>201 何のアライメントのことかわからないけど キャッシュライン同じだとだめじゃないの
208 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 17:05:52.60 ID:QK+jEBGl0.net] こういう待ち時間が僅少なものはスピンロックの方がいいぞ
209 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 18:06:05.25 ID:W1MTXd47M.net] というよりこの場合CASが成功するまで繰り返せばいいだけ
210 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 18:43:17.89 ID:QK+jEBGl0.net] bitset 位なら自分でcasで実装するのが最善か
211 名前:デフォルトの名無しさん [2018/09/04(火) 20:32:54.12 ID:j0Ybv1km0.net] C++に標準で画像を表示する方法がないと聞いたけど どんな方法で出来るのか教えてくれないか? openGLとダイレクトX以外にないものなのか
212 名前:さまよえる蟻人間 mailto:sage [2018/09/04(火) 20:35:12.07 ID:I66W1B5fd.net] GDIならウィンドウに画像表示できるよ。
213 名前:デフォルトの名無しさん [2018/09/04(火) 20:40:18.08 ID:j0Ybv1km0.net] そんなものがあるのか 調べてみるわ
214 名前:さまよえる蟻人間 mailto:sage [2018/09/04(火) 20:44:23.36 ID:I66W1B5fd.net] 他にもgtkmmとかQtというのも、ウィンドウに画像表示できる。
215 名前:デフォルトの名無しさん [2018/09/04(火) 20:47:51.19 ID:j0Ybv1km0.net] 3つだけじゃないんだなw ありがとうそっちのほうも調べてみるよ
216 名前: mailto:sage [2018/09/04(火) 21:01:31.49 ID:lJV/Mb/R0.net] >>197 はちみつさん、>>201 ,203-205 コメントありがとうございます。 >>204 ,205 初めて atomic を使ってみました https://ideone.com/HHUfCw そのままでは atomic を vector の要素にはできないようで、stackoverflow 由来の変てこな回避策をとっています https://stackoverflow.com/questions/13193484/how-to-declare-a-vector-of-atomic-in-c マルチスレッドでの評価はこれからとりかかりますが、 こんな感じで CAS できてますでしょうか
217 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 21:44:16.54 ID:rJd6gmxFM.net] なんとなくだけど、 vector<bool>でなくてよいのなら、複数スレッドからビットをonにしまくったところでそもそも問題にならないのでは?
218 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 22:20:34.19 ID:gG5zqknwd.net] windowsでのパイプでのやり取りに詳しい人助けてくれませんか あとで一部ソースコードは載せます パイプ処理を非同期で行いたい 1. CreateNamedPipeで名前つきパイプを作成 2. CreateEventでオーパーラップ構造体にシグナル用のイベントをひもづける 3. 「非同期」でConnectNamedPipeを行う 4. WaitForSingleObjectでタイムアウトか接続が来たらパイプのコネクトをする この流れで処理を作ろうとしてる ただ、非同期な設定にすると上手く繋げず困ってます そもそも名前つきパイプで非同期処理はできない..?? msdnにはCreateNamedPipeの第3引数にPIPE_WAITかPIPE_NOWAITかあるが、 PIPE_NOWAITは使用しないでくださいとあるのでPIPE_WAITを指定すると同期処理で待機することはできました ただし、接続が来なかったらタイムアウトみたいなことができないので、ためしにPIPE_NOWAITにするとGetLastErrorによると218のエラーを返してくる オーパーラップ構造体を指定したらConnectNamedPipeは非同期云々掛かれてるけどもできないのかな..?
219 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 22:34:45.20 ID:Nt/zN6W10.net] どうやっても無理
220 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 22:41:49.50 ID:GmxIRs0ad.net] dirty とか使わず単に set T e; while (!_v[q]. _a.compare_exchange_weak(e, e|(1<<r)) {} reset T e; while (!_v[q]. _a.compare_exchange_weak(e, e& ~(1<<r)) {} じゃないのよく分からんけど
221 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 22:47:11.82 ID:gG5zqknwd.net] >>214 それまじすか....
222 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 23:05:32.40 ID:Nt/zN6W10.net] >>216 待たないでデータ読むにはPeekNamedPipeの第五引数cbAvailでサイズ判定してcbAvailが0以外ならデータ読んでも止まらない これ以外の方法は何やってもダメ Linuxみたいにすんなり行かんね
223 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 23:07:37.86 ID:gG5zqknwd.net] >>217 そうなのか 今読めてるのは全部同期処理してるのか... 今からそのAPI調べてみる 読み込むのはそれでよかったとしてコネクトも同じ考え?
224 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 23:07:51.12 ID:b2qgijeQr.net] sort に渡す比較関数って、たとえば sort(A.begin(), A.end(), [](int a, int b){return a > b;}); としたら、降順になるのか昇順になるのかいつも分からなくなるんだが、どうやって覚えたら良いの 不等号の向き、つまり return で返る真偽とコンテナの要素番号の大小がどう対応してるのか分からない
225 名前:デフォルトの名無しさん mailto:sage [2018/09/04(火) 23:59:12.10 ID:IwUdbTOo0.net] a, bで順序がわからなくなるのなら、 first, secondとかleft, rightとかにすればいいんじゃね? first < secondが昇順でなかったらクレーム続出だろ
226 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 00:07:00.10 ID:p8WqhzKed.net] サーバー側だけどこんな感じです。 スマホで打つの限界がある... { HANDLE handle = CreateFileName(" \\\\.\\pipe\\"sample , PIPE_ACCESS_DUPLEX, // ここの | って意味あるのかな? // 両方とも0なので PIPE_TYPE_BYTE |PIPE_READMODE_BYTE | PIPE_WAIT, 1, 0, 0, 0, NULL ); OVERLAPED over = {0}; over.hEvent = CreateEvent(NULL, TRUE, FALSE, "sampleEvent"); BOOL result =ConnectNamedPipe(handle, &over); DWORD error = GetLastError(); if( ( 0 == result) && ( ( ERROR_SUCCESS == error ) || ( ERROR_PPE_CNNECTED != error ) || ( ERROR_IO_PENDING != error ) ) { WaitForSingleObject(); //本当はここで待ってほしいが、ConnectNamedPipeで止まる } }
227 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 00:13:10.80 ID:9rSvLDak0.net] >>213 何がいいたいのかよく分からんな。 4のwaitforでタイムアウトか接続されたか分かるよね? 普通に問題なく動くよ。
228 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 00:18:10.89 ID:VENvGGw0d.net] >>222 理想の流れは1-4の流れにしたかった ただ実際は非同期処理が上手くできておらず3のConnectNamedPipeで捕まる クライアント側が居なかった場合ずっと待機し続けることになる そうなっているのが現状 ソースは思い出してかいたのが>>221
229 名前:デフォルトの名無しさん [2018/09/05(水) 00:30:09.32 ID:+wARDt+J0.net] ココにサンプルコードがある eternalwindows.jp/ipc/namedpipe/namedpipe02.html FILE_FLAG_OVERLAPPED を追加する よく分からんがコレとはまた違うのか
230 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 00:37:34.35 ID:ABz0W8sZd.net] >>224 FILE_FLAG_OVERLAPPEDの使用はまだ試してないので明日試してみますありがとう FILE_FLAG_OVERLAPPEDに関しては持たないときの条件を使ってたんだけどだめだったんかな... これをしたかったのだが... https://msdn.microsoft.com/ja-jp/library/cc429611.aspx hNamedPipe ハンドルが FILE_FLAG_OVERLAPPED フラグを持たないとき、かつ、lpOverlapped パラメータで有効なポインタを指定したときは、この関数は非同期的に実行されます。 制御はすぐに返り、戻り値は 0 になります。GetLastError 関数は、ConnectNamedPipe 関数を呼び出す前にクライアントプロセス側が接続されていたときは ERROR_PIPE_CONNECTED を、そうでないときは ERROR_IO_PENDING を返します。 peekNamedPipe読んでるけど難しい
231 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 01:24:39.22 ID:BafBBEgt0.net] peekで調べるのはcbAvailだけ データは読まなくていい 読むときはReadFile
232 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 02:51:54.52 ID:n3z3O06I0.net] C++関係無いよね Win32APIスレに行くべきだと思う https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa365146(v=vs.85).aspx こっちにはその部分に相当する箇所が無いようにみえる FLAG_OVERLAPPEDの有無で非同期/同期は決まるんじゃないのかなぁ >If hNamedPipe was not opened with FILE_FLAG_OVERLAPPED, the function does not return until a client is connected or an error occurs. ってあるし
233 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 12:47:17.08 ID:TWmx8fnR0.net] >>223 >クライアント側が居なかった場合、ずっと待機し続ける パイプって、パイプラインにデータが流れてくるまでは、ブロックされるものだろ。 データも流れて来ないのに、先へ進んだら、バグるだけ その際、非同期なら、データ無しで、即座に返答が返ってくるのでは?
234 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 13:15:20.01 ID:mkiFi/5o0.net] 入力が「まだ来んからちょ待っとれ」なのか 「来るわけないやろアホかおまえ」なのかは 別の手段で判断せにゃならん
235 名前:はちみつ餃子 mailto:sage [2018/09/05(水) 15:48:09.73 ID:QNa0Ltxl0.net] まあ常識的には適当な時間でタイムアウトするようにするくらいのものかな。
236 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 16:08:15.65 ID:Nag0NR3Rd.net] >>221 https://stackoverflow.com/questions/14306499/non-blocking-connectnamedpipe-event-not-getting-signaled/14306743 PIPE_NOWAIT を使えば ERROR_PIPE_LISTENING だの ERROR_IO_PENDING が即座に返されるが WaitForSingleObject は発火しない PIPE_WAIT だと当然ブロックする PIPE_NOWAIT はlan managerとの互換性のために残されているだけで使用は推奨されていない 面倒でも FILE_FLAG_OVERLAPPED を使うしかない
237 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 16:09:55.39 ID:Nag0NR3Rd.net] と書いたけどカッコつけずに後先考えず PIPE_NOWAIT でポーリングしてもいいか
238 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 18:53:58.76 ID:H6UyuApwM.net] void hoge(int x, int *returnint){ returnint = int * 2; } int hoge(int x){ return int * 2; } これって内容同じですか?
239 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 19:15:02.29 ID:BafBBEgt0.net] どっちもコンパイルエラー出る点では同じ
240 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 19:32:27.66 ID:YeNc+rPy0.net] >>233 C言語に対して重大な勘違い、または質問レスに些細な打ち間違い、 どちらかだと思うが、どちらかは分からない。
241 名前:235 mailto:sage [2018/09/05(水) 19:33:03.57 ID:YeNc+rPy0.net] C言語じゃなくてC++だね、ここ。
242 名前:デフォルトの名無しさん mailto:sage [2018/09/05(水) 22:59:59.06 ID:yXdlNP4XM.net] selectしろや
243 名前: mailto:sage [2018/09/05(水) 23:22:24.89 ID:juRrGCxW0.net] >>215 内容をみてくださり感謝いたします、とても考えさせられました まず >>211 に二点誤りがありました ・コンストラクタ引数に与える bit 数から、内部 vector<atomic<int>> の確保容量を計算する方法に誤りがあった ・CAS 後にスピンロックするかどうかの判断にあやまりがあった 修正 https://ideone.com/nwcmzq >>215 >while (!_v[q]. _a.compare_exchange_weak(e, e|(1<<r)) {} >while (!_v[q]. _a.compare_exchange_weak(e, e& ~(1<<r)) {} >(e は未初期化状態でも構わない) >>195 「やりたいことはエラトステネスのふるいなので、この場合オンしたあとオフすることはありません」 に範囲を限定するのならば >>215 はうまくいくと思います。これには「なるほど!!」と思いました。 ビットセットの最中は別スレッドのビットリセットやビットテストをスピンロックさせたい、 とかの排他制御をやるのならば、dirty-bit(というか1ビットセマフォ)を作らないといけないと考えています
244 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 02:04:16.57 ID:Gt7E2PT1M.net] >>234 ,235 すみません C++にあまり詳しくないのでわからないのですが、どこがおかしいのでしょうか? これなら内容等しいですか? void hoge(int x, int& ret){ ret = int * 2; } int hoge(int x){ return int * 2: }
245 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 02:08:35.51 ID:itCyrIVk0.net] それはギャグで言っているのか? void hoge(int x, int& ret){ ret = x * 2; } int hoge(int x){ return x * 2: }
246 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 02:15:35.03 ID:Ev1vpWJGM.net] >>240 すみません素でボケてました… それなら同一ですか? returnする場合と参照渡しする場合の違い(速度など)があるのか知りたかったです
247 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 02:38:44.74 ID:itCyrIVk0.net] えーっと、 上段の参照渡しは呼び出し時に渡した変数そのものがやってきて書き換える。 下段のやつはコピーを返すので一手間ある。 理論的には下段の方がちょっと遅い。 まぁ、コンパイラが頑張ってきえるかもしれんし、 デルタ時間的に差はあるかもしれないが最近のコンピュータならあまり問題にならない。 それよりも速度を気にするなら採用しているアルゴリズムを精査したほうが効果的。 ちょっと変な文になった。
248 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 05:45:03.77 ID:UQb09hzL0.net] 厳密なところはアセンブラ出力を個別に見ないと分からない、 という前提はひとまず措くとして…。 int x, ret1, ret2; // x が未初期化ってところは見逃してくれ hoge_ref(x, ret1); // void hoge(int x, int& ret) ret2 = hoge_val(x); // int hoge(int x) 上は第2引数に参照を渡す手間が必要な代わりに返り値の処理は不要 下は引数1個で済む代わりに呼出側で返り値を別の変数に代入しなきゃいけない 相殺してどっこいどっこい大差なし、じゃないかな。 計算結果を変数に入れる必要がない場合、等はまた別のお話。
249 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 05:49:16.79 ID:IzfX8EX20.net] >>240 後者の末尾がコロンになってるのがそのままやで。
250 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 05:59:16.76 ID:IzfX8EX20.net] 仮に差があったとしてもナノ秒レベルの話やん
251 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 07:14:55.98 ID:3Sjg8sdP0.net] 速度どうこうは1兆回回すループの中にあるとか1マイクロ秒以内に完了しないと原子炉が爆発するとか プロファイラでクソ時間がかかってることが判明したとかした時だけ気にしよう
252 名前:243 mailto:sage [2018/09/06(木) 08:27:46.68 ID:UQb09hzL0.net] 実際のところ「別のお話」と切り捨てた部分が大切でね。 元の質問から逸れてしまうけど。 関数が計算する結果の値だけが欲しい(別の変数に格納する必要がない、 格納すべき変数そのものが存在しない)場合とか、 返り値に相当するのがint等の単純なデータでなく大きなクラスの場合とか、 その辺りを基準に比較すべきなんだよ。
253 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 08:44:12.19 ID:IzfX8EX20.net] 早すぎる最適化は諸悪の根源っていうもんな。
254 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 08:51:51.10 ID:j/wx9LUv0.net] 同意。固定長オンリーなどの最適化を最初から入れ込むとロクなことがない。
255 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 09:29:04.75 ID:mrWZ3sxKM.net] そーそー 尻拭く時間だけ早くしてもンコが早く出なきゃしゃーない
256 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 10:29:33.35 ID:c/F3wcvdM.net] >>242 何言ってんの、逆でしょ 差が観測できるかは別にして下の方が速い(効率的) int返すならレジスタ返しなんだから メモリアクセスよりずっと速い
257 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 10:57:52.18 ID:IzfX8EX20.net] >>251 関数単独を見るとそうだが、 レジスタで返してもそれを結局は変数に書き込むじゃんという >>243 の話と合わせて考えると レジスタを経由する分だけ遅くなり得るっしょ。 ただ、この関数を実行した結果を長期には保存しない (式の途中でこの関数を使うとか) のだと 後者の方が速かったりもするだろうし、まあ、状況によるよな。
258 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 10:58:36.13 ID:IzfX8EX20.net] 実際のところ、インライン化されて更に他の最適化とコンボが起こったりすると 普通の人間にはどうなるか予測がつかんので考えるだけ無駄。
259 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 11:15:06.66 ID:c/F3wcvdM.net] >>252 なんで呼び出し側の話がはいってくるんだよ そっちの話を含めるとしても 呼び出し側もレジスタのまま処理が行われるのが普通だし、 メモリに書き出されるとしても、 参照と同程度になるってだけ このABIを理解するのはc/c++使う上で基本 無意味と思うのは結構だがそれはお前の関心がないってだけ レスしなけりゃいい
260 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 12:11:07.39 ID:uRta3OIBM.net] intの場合は速度差は特に考慮しなくて良いんですねありがとうございます それと、関数内でOpenCVで画像をゴニョゴニョして、結果の画像をリターンしたい場合は、どちらが良いのですかね? 特にメモリリークを起こしたくない(今現在起きてるので改善したい)ので、もし何か重大な違いがあるなら知りたいです void hoge(cv::Mat x, cv::Mat ret){ ret = x + cv::Scalar(100); } cv::Mat hoge(cv::Mat x){ return x + cv::Scalar(100); }
261 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 13:28:43.07 ID:IzfX8EX20.net] >>254 呼出し側の状況によっても変わりうるから呼出しの状況を含めるってのがそんなにおかしな話かね。 あと、あくまでもこれは C++ という言語を中心にした一般原則としてどうコンパイルされることも「有りうる」ということを述べているのであって、 特定のアーキテクチャやコンパイラや ABI を想定したものではないよ。 多くの (あるいは主要な) 処理系であなたが言うような結果になるというなら、 それはそうかもしれないが、そこには単に私の関心がないのも確か。
262 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 13:34:38.93 ID:IzfX8EX20.net] >>255 前者のコードの cv::Mat ret は cv::Mat& ret の間違い?
263 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 13:53:20.00 ID:c/F3wcvdM.net] >>256 それはお前の間違った理解であって一般とは言わない だいたい呼び出し側も含めて反論されてんのになにぼけたレスしてんだよ お前の理屈だとレジスタの返しが無用となるじゃないか x64ならraxでaarch64ならx0で返り値を返す 32bitのレガシーならいざしらず64bitでもabiはそう決められてるわけ お前の興味のない低いレイヤーではそういうのを最大限活用して効率的にcpu回してんだよ
264 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 14:06:16.01 ID:IzfX8EX20.net] >>258 > だいたい呼び出し側も含めて反論されてんのになにぼけたレスしてんだよ それは >>254 のことだろ? それは特定の命令セットや ABI でないと成り立たないから、 そうでない一般論としてはどうともなりうると私は言っているので論点が違うし、 私はそっちの論点は気にしてなかったという話じゃないか。
265 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 14:09:29.47 ID:c/F3wcvdM.net] >>259 現実のはなししようぜ 成り立たないシステムあげてみなよ
266 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 14:11:05.68 ID:IzfX8EX20.net] >>255 知らんな。 関心は無い。
267 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 14:27:25.26 ID:IzfX8EX20.net] >>255 前者については & の脱字だと仮定して答えるけど、 その脱字が無ければ、前者でも後者でも最終的な結果に差はないと思う。 特にメモリリークにつながりそうな要素もない。 ただ、単純に、局所的に考えるならば後者の方が効率的と言えると思う。 前者だと呼出し側では結果を受け取るための cv::Mat 型の変数を用意しなければならないが、 そのときにデフォルトコンストラクタが走ってから結果は operator= で格納するという形になる。 後者だとコピーコンストラクタ一発で済むので簡単。 場合によっては RVO が適用されるかもしれない。 一度作った変数を何度も結果格納用に使いまわすのならば、 前者の方がメモリアロケーションの回数を抑制できる (効率的になる) 可能性も有るけど、 Mat の実装次第ではそうならないかもしれないし、 そこらへんは実際にやってみないとわからない。 ところでメモリリークが起きていると判断したのは何かツールを使って検証したの?
268 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 14:31:00.99 ID:IzfX8EX20.net] あっ、 >>261 で >>255 にアンカーを付けちゃったけど、これは >>260 の間違いね。 現実の話というなら、インライン化や最適化が入れば ABI もクソもねぇし、 そんなの考えたらキリがないやろ。
269 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 18:25:26.14 ID:c/F3wcvdM.net] >>263 関数内の最適化のみで考えればいいだけなんだからきりはあるだろ つまりインライン展開なし、LOTなし ABIを意識するのは全然特殊じゃない 言語間のよびだしはざらだし、 クラッシュダンプにスタックトレース残すためにあえてインライン抑制したりする お前が経験不足なだけだよ
270 名前:はちみつ餃子 mailto:sage [2018/09/06(木) 18:41:01.02 ID:IzfX8EX20.net] >>264 そっちの脳内でどんな前提を置いてるかなんて知らんがな。
271 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 19:48:52.61 ID:c/F3wcvdM.net] >>265 コテハンの割に薄いやつだ もとの質問は関数から値の返し方についてどちらが速いかという質問なんだから、 関数のインライン展開がないと仮定すれば、定性的に答えられる問いだ かつその仮定は別に現実ばなれしてるわけでもない それをお前はその知識が有用であることも知らずに考えるだけ無駄とかぶったぎってるわけだ このスレは相談室 無駄なのはそういうお前の存在ではとおれは思うわけ
272 名前:デフォルトの名無しさん [2018/09/06(木) 20:12:24.70 ID:64ZwjQvb0.net] malloc()したヒープはfree()解放するのは当然 ウンコしたあと水で流さないぐらい行儀が悪い
273 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 20:23:27.14 ID:itCyrIVk0.net] メモリーリークは基本的に自分でNEWすることで起こる。 最近のC++では基本的に自分でNEWすることはほとんどない。 動的なメモリが欲しければvectorを使う。 後は、ポインタにインスタンスを確保しないで関数に投げるとかもやってはいけない。メモリを破壊することになる。 あと、どうしてもnewが必要だったりGCが必要な時はスマポを使う。 そういう作法でやると、ユーザーコードでnewすることはほぼない。
274 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 20:47:20.81 ID:itCyrIVk0.net] えーっと、関数にポインタを投げる時はその関数の仕様を精査して扱わないとほんとやばい。
275 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:04:04.33 ID:bw6Oo6uj0.net] newとdeleteを使いこなせない補助輪付C++グラマってのも問題だけど
276 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:10:02.71 ID:iyjSCMca0.net] スマポはGCじゃねえよ ぼけ
277 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:14:09.31 ID:itCyrIVk0.net] shared_pointerは参照カウントっていうGC機構ですよ?
278 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:17:21.85 ID:itCyrIVk0.net] >>270
279 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:18:00.66 ID:itCyrIVk0.net] おっと。 >>270 補助輪があろうがバグ出すよりマシだと思うよ。それと保険的な意味もあるし。
280 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:18:22.90 ID:iyjSCMca0.net] CGってそもそも何だ? アプリが「今、解放しろ」というタイミングで動くのをGCというならfreeもGCだぞ
281 名前:デフォルトの名無しさん [2018/09/06(木) 21:20:24.16 ID:64ZwjQvb0.net] いつ解放されるか分からないとか そもそもオブジェクトの外部でポインタの生存期間を制御できてないコードがヤバイわ
282 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:24:58.09 ID:itCyrIVk0.net] >>275 そういう、広義解釈は話題が滅茶苦茶になるのでやめましょう。 GCはガベージコレクションだよ。freeは解放関数だよ。 シェアードポインターの解放タイミングは普通コントールしないのでGCだと思ってます。 というか、開放タイミングが未定だからシェアードポインタ使うんじゃないですか?
283 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:27:59.96 ID:itCyrIVk0.net] それは全能でないとバグが出ちゃうのでこういう機構が発明されました。 書くときは大まかには寿命は把握しているとは思うのですが、細部までは精査しないことが多いんじゃないでしょうか。 自分のクローンに共有オブジェクトを持たせるときとか普通に書くと滅茶苦茶大変ですよ?
284 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:37:24.49 ID:iyjSCMca0.net] >>277 広義解釈してるのはおまえだよ シェアードポインタの解放タイミングはデストラクタだろうがよ freeと何がどこが違うんだよ おまえどこまでオレオレ空想してるんだ?
285 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:38:17.39 ID:itCyrIVk0.net] >>276 それはある程度アクセス権の範囲を考えれば何とかなりそうな予感。 それと開放した後のメモリ叩かれた時とどっちがいいか相談ってことで。
286 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:41:02.92 ID:itCyrIVk0.net] >>279 複数の共有がある場合、一個のデストラクタが走った程度では解放されませんよ? freeは別にデストラクタに仕込む必要ないじゃないですか。 それと、複数の共有がある場合適切にfreeできますか?
287 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:42:45.15 ID:JT+LXegNM.net] コレクションしてないのになんでgcなんだよ。アホすぎる
288 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:43:23.10 ID:bw6Oo6uj0.net] シェアードはマルチタスクには不向きだし
289 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:49:40.12 ID:itCyrIVk0.net] コレクションサイズが1のコンテナはないのですね。まぁ、冗談は置いといて。 物事を知ってるなら後は任せました。無知でごめんなさい。
290 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 21:51:04.10 ID:itCyrIVk0.net] >>283 マルチスレッドならアトミックにできた気がしますけど、どうでしたっけ。 マルチプロセスならそもそもメモリ空間が違うのでお門違いですね。
291 名前: mailto:sage [2018/09/06(木) 22:00:46.00 ID:N2ZzCqNY0.net] >>272 参照カウンタは普通GCに含めないのでは?
292 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 22:02:22.60 ID:itCyrIVk0.net] https://ja.wikipedia.org/wiki/参照カウント こういう記事を見つけました。
293 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 22:04:19.65 ID:itCyrIVk0.net] ホントお前ら人殺すことばっか考えてるよな。 そういうのは良いから初心者殺すのマジやめて。
294 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 22:04:41.28 ID:vgkXomJH0.net] gcの一実装として参照カウンタ方式があるだけで、スマポはgcじゃない。
295 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 22:06:33.66 ID:itCyrIVk0.net] それならそれでいいです。
296 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 23:18:28.17 ID:8cSq8zHP0.net] >>288 横からでスマン
297 名前:ェ、他の初心者に偉そうに大嘘教えてるやつを初心者とは普通呼ばない 都合のいいときだけ初心者ヅラはだめよ [] [ここ壊れてます]
298 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 23:34:23.61 ID:3bNAvGWPM.net] >>262 ありがとうございます forの中で何回も関数呼び出すので前者が良さそうですね
299 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 23:34:43.07 ID:itCyrIVk0.net] >>291 嘘の範囲を限定しないと俺大罪人じゃないですか。 まぁ、いいや。 メモリーエラーで落ちろ。
300 名前: mailto:sage [2018/09/06(木) 23:34:53.93 ID:N2ZzCqNY0.net] >>289 スマートポインターのうち std::shared_ptr は参照カウンタを内蔵しているのだから @参照カウンタが GC、故に、std::shared_ptr も GC A参照カウンタが GC でない、故に、std::shared_ptr は GC でない @Aのどちらかしかない 参照カウンタが GC なのにスマートポインタが GC でない、というのは矛盾しているのでは? 私は「参照カウンタは GC じゃない」と思う
301 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 23:48:27.91 ID:8cSq8zHP0.net] >>293 >>251 もちろんインライン展開される場合は除く(展開されたら多分同じコードになると思うが あと >>255 の質問に対して>>268 は不適切、>>268 から話が変な方向に行ってる OpenCV使ってるって言ってるし、間違った使い方してリーク(>>255 がnewしたのではない部分) の可能性の方が高いと思うけどね
302 名前:デフォルトの名無しさん mailto:sage [2018/09/06(木) 23:52:47.61 ID:HW23dE280.net] >>294 なにも矛盾してないよ。 GCの一実装として参照カウント方式を使ったものがある。 スマホの中に参照カウントを使ったものがある。 だからといってGC=スマポじゃない。 エンジンで走る車があって、エンジンで飛ぶ飛行機があっても、車は飛行機じゃないのと一緒