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
175 名前:デフォルトの名無しさん mailto:sage [2018/09/02(日) 19:17:19.67 ID:KDgwy3t20.net] 君らいっぺん3Dのゲームがどういう技術で成り立ってるか調べたらいいよ 全く想像つかないのに適当こいてるだろ?
176 名前:デフォルトの名無しさん [2018/09/02(日) 19:26:28.00 ID:fUkDgbHp0.net] >>171 しらべてみたら監督技術、プロデュース技術、ディレクション技術なんだな。 一番重要なのは資金調達技術だって。 思ってたのと全然違うわ。
177 名前:デフォルトの名無しさん mailto:sage [2018/09/02(日) 19:29:29.85 ID:KDgwy3t20.net] アホだろお前
178 名前:デフォルトの名無しさん [2018/09/02(日) 19:32:57.27 ID:fUkDgbHp0.net] ゲーム業界ではパワポを使いこなせないと会議で発言権を得られないって聞いたことがあるな。
179 名前:デフォルトの名無しさん [2018/09/02(日) 19:35:22.26 ID:fUkDgbHp0.net] そういえばジョブス氏も皆さんの前でお話しするときはパワポ使ってたよね。 WindowsよりOSXというお話をするときでさえ、スクリーンにはパワポが映ってた。
180 名前:デフォルトの名無しさん [2018/09/02(日) 19:36:03.23 ID:4Jf6YH6e0.net] 話がいつの間にか売れるゲームの話になってる? 元の話は学生が就活時にCでゲーム作った事が役に立つかって話だったと思うが。
181 名前:デフォルトの名無しさん [2018/09/02(日) 19:37:22.81 ID:4Jf6YH6e0.net] >>175 Macで動くやつではなく?
182 名前:デフォルトの名無しさん mailto:sage [2018/09/02(日) 19:55:02.00 ID:KDgwy3t20.net] >>176 なってないw QZと165に釘さしたかっただけ 別に趣味グラマを否定したいわけじゃないけど、一本人が使いたがるようなレベルのソフトを作ろうとすると、言語の知識だけではない様々な現実的な問題に直面するだろ それを乗り越えたかどうかってのは採用担当の評価に大きく関わってくると思うけどね はっきり言うと、QZのレスは、それを乗り越えるのは意志だけ(つまりソフトを作り上げるために必要になってくる知識など、言語の知識以外には無い)と暗に決めつけてる 最近そういう傲慢な趣味グラマがC++界隈でよく見受けられるけど、そういうの良くないよマジで
183 名前:デフォルトの名無しさん [2018/09/02(日) 20:08:55.68 ID:Tb3tt8fk0.net] それでコードはもうすでに自分は書けるもんだと勝手に思い込んで まともな教育を受けてない低学歴知恵遅れのアホなくせに思い上がってるウンコが この板にはわんさかいる 視野が狭いとそうなる 低学歴知恵遅れはどうしても視野が狭くなる 知見の範囲が限られるからな
184 名前: mailto:sage [2018/09/02(日) 20:09:48.00 ID:oSO4LvdH0.net] >>178 >QZのレスは、それを乗り越えるのは意志**だけ** >>164 ではそうはいっていませんよ、意志の重要性を主張していますが、知性(=知識)が不要とはいっていない、ちょっと言葉が足りなかったのは認めますが 知性がなければ、そもそもプログラムを記述することすら出来ないでしょう? 文脈としては >>150 を応援している内容です 「根性論」の気配を感じて反感をもたれているのだろうとは推察しますけれども
185 名前:デフォルトの名無しさん [2018/09/02(日) 20:12:17.71 ID:Tb3tt8fk0.net] 質問してるヤツ未満のとにかく程度の低いウンコが この板で幅をきかせてるのが一番の問題
186 名前:デフォルトの名無しさん [2018/09/02(日) 20:30:49.80 ID:fUkDgbHp0.net] 質問者のほうが詳しいもんな。
187 名前:デフォルトの名無しさん mailto:sage [2018/09/02(日) 20:32:00.95 ID:ZRAAplmr0.net] 暗にマウンティングしようとしすぎなんだよ、聞かれたことだけ答えてろ
188 名前:デフォルトの名無しさん mailto:sage [2018/09/02(日) 20:40:57.55 ID:x4is64QR0.net] >>167 いや、俺はゲームプログラムは作れるが 絵や音楽は無理だわ
189 名前:デフォルトの名無しさん [2018/09/02(日) 20:42:56.80 ID:fUkDgbHp0.net] 絵や音楽を作るAIをプログラミングすれば。
190 名前:デフォルトの名無しさん [2018/09/02(日) 22:53:04.36 ID:fUkDgbHp0.net] gperfをconstexprで実現するライブラリない?
191 名前:デフォルトの名無しさん [2018/09/02(日) 22:54:40.74 ID:fUkDgbHp0.net] >>153 数十人も集まったら臨界起こる。 危険。
192 名前:デフォルトの名無しさん mailto:sage [2018/09/03(月) 14:05:29.69 ID:oGMLPH120.net] >>170 ぷよぷよにしろテトリスにしろ完全に動くから売れるんだぞ 数年前に家庭用機に動きもっさりバグだらけのテトリスがあったが発売数日で誰もやってなかったよ
193 名前:デフォルトの名無しさん mailto:sage [2018/09/03(月) 20:11:20.95 ID:e/XZidXx0.net] 数年て 30年近く前の話だろそれ…
194 名前:デフォルトの名無しさん mailto:sage [2018/09/03(月) 20:23:04.08 ID:JI8nhEFS0.net] 何言ってんだこいつ・・・w
195 名前:デフォルトの名無しさん mailto:sage [2018/09/03(月) 20:23:26.23 ID:CjQwreEv0.net] 無論コレですな ttps://koty.wiki/Tetris
196 名前:デフォルトの名無しさん mailto:sage [2018/09/03(月) 20:45:30.49 ID:e/XZidXx0.net] てっきり任天堂のファミコンテトリスの話かと
197 名前:デフォルトの名無しさん mailto:sage [2018/09/03(月) 20:54:01.67 ID:oGMLPH120.net] xboxoneだぞ
198 名前:デフォルトの名無しさん [2018/09/03(月) 20:57:10.35 ID:E2St7m4+0.net] テトリスごときでcなんか不要 javascriptで十分 codepad.org/GePSyxwv ← コレでできあがり このコードをメモ帳にコピペしてaho.htmlで保存 ↓ aho.htmlダブルクリック ↓ テトリス起動
199 名前: mailto:sage [2018/09/04(火) 00:05:00.11 ID:lJV/Mb/R0.net] 以前の話 https://mevius.5ch.net/test/read.cgi/tech/1531558382/942,943 やりたいこと https://mevius.5ch.net/test/read.cgi/tech/1524570314/713 質問 一つの bitset または vector<bool> に対して、異なるスレッドから集中してビットをオンしまくる、ということをして矛盾が発生することはありますか? やりたいことはエラトステネスのふるいなので、この場合オンしたあとオフすることはありません こういうことをして大丈夫かどうか調べてみたけれどもよくわかりません bitset https://ideone.com/12V4WY vector<bool> https://ideone.com/iVcLWd 付随しての質問 biset や vector<bool> というのは、一つの物理バイトに対して複数の bool を詰め込んだ作りとして実装されているのでしょうか? この場合 bitset[index] = boolean, とか vector[index] = boolean (operator[] が「bool の参照」
200 名前:?を返す、みたいな感じ) は実際にはどのように記述されているのでしょうか? [] [ここ壊れてます]
201 名前:さまよえる蟻人間 mailto:sage [2018/09/04(火) 00:09:11.92 ID:I66W1B5fd.net] See source by your IDE.
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++グラマってのも問題だけど