1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part77 pc12.2ch.net/test/read.cgi/tech/1263556932/
75 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 15:59:39 ] そう思うなら思い切ってpublic変数にすればいいだろ でもgetter/setterを敢えて持つ理由は、プログラマに「今private変数を いじってますよ」という事を常に意識させる効果がある
76 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 16:10:53 ] >>72 class widget { public: inline void set_x(int _x) { x = _x; } inline int get_x(void) { return x; } private: int x; }; ↓内部仕様を変更したくなった class widget { public: inline void set_x(int _x) { p->set_x(_x); } inline int get_x(void) { return p->get_x(); } private: impl *p; }; しっかり隠蔽になってるね 基本的に公開する必要があるなら全部アクセサでいい 未来永劫仕様を変えない保証があるなら丸出しでもいい コンストラクタの分だけセッターを作る必要はない 単純セッターなら普通は void set(const Obj &obj) { m_obj = obj; } hoge.set(Obj(a1, a2)); こうする
77 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 16:39:05 ] >>75 一貫性がないのは嫌なので、public変数にするとなると全てのクラスをpublic変数にする事になって、これも嫌な感じがします。 >>76 確かに隠蔽性がなくなるわけではありませんでした。 インターフェイスがすっきりしないのが嫌なところですね。 設定値が多い時は、構造体に纏めてget/setするという事ですね。
78 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:08:13 ] そのたくさんある変数はすべてset/getする必要があるの? 内部実装のためにあるデータだってあるでしょ 外部から見たときにset/getする必要があるやつだけ publicなsetter/getterを定義すればいいよ
79 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:30:04 ] vectorにクラスを入れるということは普通しないのでしょうか?
80 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:30:44 ] よくやる
81 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:37:08 ] むしろやらないでどうする
82 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:40:03 ] >>79 とても若干良くある クラスのコピーコストが気になるレベルならポインタ格納するなりlist使うなりするけど。
83 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:49:29 ] >>60 明確な実装方法を表したサイトってないの?
84 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:51:39 ] クラスを入れる、っていう表現がまかり通るのが驚き。
85 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:58:08 ] >>83 そんなものはない!
86 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 18:03:51 ] #define class struct オヌヌメ
87 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 18:09:34 ] >>71 なるほど ちなみにスレッドプールしておいたスレッドの空き/使用中の管理というのは自分でやる必要があるのでしょうか?
88 名前:79 mailto:sage [2010/02/16(火) 18:25:17 ] よくやるんですね。ありがとうございます。 自分のプログラムで変なエラーが出てしまったので、もしかしたら間違ったやり方をしているのかと思いました。 できるんなら、何とかしてみます。
89 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 18:35:46 ] たぶんコピー、代入あたりで間違えてるんだろうな
90 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 18:43:27 ] pimplを勧める
91 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 18:45:18 ] #undef class
92 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 19:00:34 ] >>87 beginthread云々からWin32と仮定すると IOCPに管理させるのが楽かもよ。
93 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 20:48:19 ] POSIXじゃないの?
94 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 21:25:46 ] おめーはpthreadも知らずWin32も知らないのか
95 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:00:15 ] 誰に言ってるんだ?
96 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:12:52 ] 誰が?
97 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:22:49 ] ワッフルワッフル
98 名前:97 mailto:sage [2010/02/16(火) 22:23:48 ] 誤爆しました。
99 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:24:19 ] え?
100 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:25:08 ] ww
101 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:38:45 ] うむ。苦しゅうない。
102 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 00:38:25 ] 何の?
103 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 01:05:07 ] >>53 以前メモリプール使用のスマポで計測結果張ったものですが、こんなメモリプールつこてます。 ttp://codepad.org/rrn4ZXUQ メモリ的にも処理的にも無駄を減らした実装でまだまだシンプルですが、使えるポイントはあると思います。
104 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 01:11:05 ] int get() { return mVal; } これよりも効率よくmValを外部に返す方法ってありますか?
105 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 01:17:18 ] >>72 まずインターフェースだけ考える。どんな変数を持ってるとかは敢えて考えないぐらいのつもりで、 とにかく利用者にとって自然な操作だけをメンバ関数(コンストラクタ含む)として列挙する。 それが済んでから、それらのメンバ関数を実装するための変数を必要なだけそろえる。 これなら「隠蔽になっていない」などという心配は起こりようが無いし、余計なコードも発生しない。 インターフェースを考える段階で、利用者から見て中にどんなデータが入っているのか 明らかでありメンバ関数呼び出しが煩雑なだけに見えるようなら、ただの構造体でいい。
106 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 01:38:40 ] >>103 Test継承したら使えないジャマイカ
107 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 02:06:51 ] >>104 ねーよjk
108 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 02:13:11 ] >>104 #define get() mVal foo.get();
109 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 04:46:59 ] スレッドセーフなキューが作れれば全てのマルチスレッドは統一的に扱えるはず とおもって探した。 lock-free wiat-freeかはしらないがこれ。無料だとこれくらいかと。 Thread Safe Template Library sourceforge.jp/projects/freshmeat_tstl/ IntelR Threading Building Blocks www.threadingbuildingblocks.org/
110 名前: ◆GWRSHcLrd6 [2010/02/17(水) 07:22:13 ] >>103 あ、なんか僕が今作りなおしているやつも似た作りです。 これが効率よさそうですよね。 そういえばboostのsimple_segregated_storage(だっけ?)ってどういう仕組み何でしょうか? >>109 なるほど。ちょいと見てみます
111 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 10:38:15 ] 可変長引数パラメータて、使いどころがよくわからないんですが どういった時に使うんでしょうか? 同じようなことができるboostのfunctionもです。 掴み所を教えてください
112 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 10:58:46 ] >>111 可変長引数パラメータって何? 関数引数の ... のこと?
113 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:23:46 ] >>112 そうです。 使い方はわかるし、boostも使い方は理解できるんですが 何に使うのかがわからないんです。 特に後者のboostは、仮想関数の引数としてfunctionを利用しても 結局テンプレートだからオーバーロードになるわけですよね? 呼び出し側で型指定するわけですし、多態的に動作させるのもできないのでは? ここで混乱している感じです。
114 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:26:48 ] >>113 printf() とか。 まぁ C++ では基本的に使わないな。 boost::function とは関係ないと思うけど、何のこと言ってんの?
115 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:32:54 ] >>114 返り値の型、引数の型を指定して関数ポインタを楽に生成できるじゃないですか。 このテクニックを利用して、引数の数、型が変化する処理を多態的にさせたいんです。
116 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:43:01 ] >>113 可変長引数に関しては>>114 に同じくprintfがいい例だと思う。 可変長引数は、C++ではあまり推奨おらず、printfに関してもboost::formatを使った方がいい。 ttp://www.kmonos.net/alang/boost/classes/format.html boost::functionに関しては、引数の型(個数も含む)が違えば、boost::functionの型も変わる(boost::functionはクラステンプレートであってクラスそのものではない)。 テンプレートによる静的多態なので、仮想関数の動的多態のようには扱えない。
117 名前:116 mailto:sage [2010/02/17(水) 11:55:42 ] 付け加えておくと、 ・可変長引数とboost::functionの使いどころは別である ・boost::functionは関数ポインタを使いやすくした物 あと、>>116 の最後の行は紛らわしい書き方だった。 boost::functionの1つの具現化(戻り値と引数の型が同じ)においては、関数ポインタによる動的多態である。
118 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 12:11:45 ] >>117 なるほど! 多態とはまた別物なんですね。 ボリモルフィズムが一気に広がるかもと思ったんですがね。 ありがとうございました。
119 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 12:22:49 ] >>115 boost::function<void ()> で、引数は全部 bind するとか、 boost::function<void (std::vector<boost::any> const&)> で引数について型消去しながらやりくりするとか。
120 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:01:27 ] (´;ω;`)さ、さ、さむいお
121 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:22:58 ] 利用者が仮想関数を呼び出す時、仮想関数の実装を知らなけば引数を渡せなくなって、ポリモーフィズムのメリットがなくなる気がするけど。
122 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 14:15:09 ] いらない
123 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:13:58 ] 非ブロッキング、ロックフリー、ウェイトフリーの定義 www.gameenginejp.com/misc/2010/2010.html
124 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:37:29 ] スレッドセーフのSTLクラスは使えるな。 boostのどのライブラリより上では。 boostにこんなのないだろ。
125 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:45:26 ] ありますがな・・・
126 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:46:17 ] ありませんがな・・・
127 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:50:33 ] TBBの日本語サンプルサイトつくってくれよ。 マルチコア時代で、CPUメーカー製の、フリーのこのライブラリは強力すぎる。 できたら毎日クリックしに行くからさ。 ja.wikipedia.org/wiki/Intel_Threading_Building_Blocks 抜粋 並列処理アルゴリズム parallel_for ループ間で依存性がない単純なループの並列処理 parallel_reduce 指定した範囲をより小さな範囲に再帰的に分割し並列処理 parallel_scan 並列プリフィックスを計算 parallel_while 不明領域、動的領域変更を伴う独立したループ操作 parallel_sort 並列処理でソートを行う pipeline パイプライン処理 コンテナクラス concurrent_hash_map STLのmapクラスをスレッドセーフにしたもの concurrent_queue STLのqueueクラスをスレッドセーフにしたもの concurrent_vector STLのvectorクラスをスレッドセーフにしたもの
128 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 16:13:42 ] サンプルはないけど日本語リファレンスあるし間に合ってる感じ
129 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 18:53:08 ] もうひとつだけ例を見てみましょう。 static LONG flag; if (flag == FALSE) { flag = TRUE; ... flag = FALSE; } このコードがまずいことはもうお分かりですね。 NT にはフラグのチェックとセットをアトミックに行える InterlockedCompareExchange がありますから、そちらを使いましょう。 if (InterlockedCompareExchange(&flag, TRUE, FALSE) == FALSE) { ... InterlockedExchange(&flag, FALSE); } hp.vector.co.jp/authors/VA000092/win32/standard-coding.html
130 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 18:58:30 ] 8スレッド InterlockedIncrement 4.398sec InterlockedCompareExchange 4.460sec CriticalSection 6.297sec d.hatena.ne.jp/streakeagle/20090205/1233833511 VC++ CriticalSectionの速度 何もないループが、0.515106秒に対しクリティカルセクションでは7.089556秒となった。 www.cycleof5th.com/tips/index.php?date=2007-05-30/3 同期オブジェクトの要約 速度 クリティカル セクション 高 ミューテックス 低 セマフォ 低 イベント 低 メータード セクション 高 msdn.microsoft.com/ja-jp/library/cc429052.aspx
131 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:08:05 ] スレッドセーフなキューを複数個用意してキューにデータ来たら、 それぞれ直列に動作する関数を動かしたいんだけど 作業が終わったらキューを観察に行くけど無かった場合、次に入ってくるまで どうやってまてばいいんだ? ひとつとしてビジーループはあるが。 それなら別変数用意してロック掛けた方が良い。ロック無しで出来る? キューは一カ所にしてすべての処理関数スレッドで共有する方が無駄ないか。
132 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:22:53 ] キューに挿入する側が、余りのスレッドを監視して空いてたら処理させればいいか。 これならロック無しでアトミック命令だけでいけそう。
133 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:24:54 ] しかしスレッドを生成するコストも馬鹿にならないから スレッドの生成・消滅はせず、恥に生成したやつを使い回したいところ。 やっぱロックいるか。処理終了してキュー待ちのロック。
134 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:27:47 ] スレッドの生成は恥
135 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:41:16 ] wait付きのビジーループでいいか
136 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:32:25 ] C++でコルーチンってできないの?
137 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:32:53 ] boostにあるにょ
138 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:35:08 ] あるんだ boostまじ何でもあるな 奴らはいったい誰と戦ってるんだ
139 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:37:11 ] 言われてみるとその言葉かなりしっくりくるよな。 C++の最適化に伴う変態記法なんて禿に親を殺されでもしない限りできないし。
140 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:39:02 ] >>138 部品の足りない世界じゃないの? というかWTLもC#並に充実させてください
141 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:45:06 ] 駆動系の部品はハイスペックだが シートもハンドルもなく部品丸出しの車
142 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:47:45 ] C++はC++です車ではありません 好い加減な比喩は滑稽なのでやめてください
143 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:48:41 ] コルーチン ttp://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3 Boost C++の何て言うライブラリで出来るのですか?
144 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:49:43 ] boost.cotoutine vaultにあるにょ
145 名前:デフォルトの名無しさん [2010/02/17(水) 20:52:04 ] >>141 部品丸出しな上 自己責任で組み替え自由な仕様だな。
146 名前:デフォルトの名無しさん [2010/02/17(水) 20:52:32 ] >>141 部品丸出しな上 自己責任で組み替え自由な仕様だな。
147 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:52:41 ] >>141 部品丸出しな上 自己責任で組み替え自由な仕様だな。
148 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:53:21 ] 車への例えがどれも的外れでワロスw
149 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:53:33 ] >>141 部品丸出しな上 自己責任で組み替え自由な仕様だな。
150 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:55:48 ] だからといってヨソの車がそんなに安全かというと……
151 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:57:31 ] >>144 valtですか。 ありがとうございます。
152 名前:デフォルトの名無しさん [2010/02/17(水) 20:58:22 ] Boost.Coroutine ttp://hamigaki.sourceforge.jp/doc/html/coroutine.html 2009-12-12 - melpon日記 - C++すら(ry Boost][C++]Boost.勉強会の資料 ttp://d.hatena.ne.jp/melpon/20091212 ttp://melt.sytes.net/data/Boost.Coroutine.ppt ・Boost.Fiber という対抗馬も最近出てきた
153 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:59:10 ] 理想的には部品丸出しではないが、 バカが作ると部品を理解していなければならなくなる 仕様だな。
154 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:06:26 ] マルチスレッドキューでロックしないサンプルできた。読み込むに失敗・キューがないときにwaitはいれたが。 #include "include/tbb/concurrent_queue.h" #pragma comment (lib, "tbb.lib") #include <process.h> #include <windows.h> #include <iostream> using namespace std; using namespace tbb; concurrent_queue<int> que; int s[2]={0,0}; unsigned WINAPI fnc(void *n) { int x,num=(int)n; while(1) { if( !que.try_pop(x) ) { Sleep(100); continue; } if(x==-1)return 0; s[num]+=x; } } int main() { HANDLE hd[2]; int n; for(n=0; n<2; n++) hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc,NULL, n ,NULL); for(n=0; n<=1000; n++) que.push(n); que.push(-1); que.push(-1); WaitForMultipleObjects(2, hd, TRUE, INFINITE); cout<< s[0]+s[1]<<endl; getchar(); }
155 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:08:51 ] 0から1000まで足すだけ。キューへマルチスレッドでpush、popして 読み取って空いてるスレッドが足し合わせていくサンプル。 答えは合ってたよ。
156 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:10:28 ] キューではロックしているだろうがな。そこを自作せずに済んだという話だ。
157 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:20:49 ] プログラム組んでて returnって打ったつもりだったら tryit, って打ってた なんか感動した
158 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:21:46 ] rをtにずらして打ってみると・・・!?
159 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:22:04 ] ゴルゴはtrycatchfinallyを0.5秒でタイプするらしい
160 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:23:35 ] >>157 夢を感じた
161 名前:デフォルトの名無しさん [2010/02/17(水) 21:33:09 ] HDL ではごく普通というか大前提の話なんだが 直列処理という枠に凝り固まった頭で見ると驚きの連続なんだろうな
162 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:39:17 ] 任意の整数を返す関数が、失敗も正常フローだった場合に すっきりするエラー通知の仕方はある?
163 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:40:28 ] 任意の整数を返す関数が、失敗も正常フローだった場合に すっきりするエラー通知の仕方はある?
164 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:42:11 ] 任意の整数を返す関数が、失敗も正常フローだった場合に すっきりするエラー通知の仕方はある?
165 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:45:58 ] 任意の整数を返す関数が、失敗も正常フローだった場合に すっきりするエラー通知の仕方はある?
166 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:46:42 ] パラメータになんか持たせるとか
167 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:57:56 ] なにを?
168 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/17(水) 22:01:15 ] _beginthreadとCreateThreadは何が違うんですか? というかどっちを使った方がいいんですか?
169 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:07:13 ] >>167 判断できる情報を >>168 適材適所。常にどちらかがよいということはない
170 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:11:21 ] C++の配列サイズ指定で変数は使えることもあるんでしょうか?それともコンパイラ依存でしょうか? MinGWで下をコンパイルは正常にでき(Warningも出ない)、arrayのsizeofは32byteとなってちゃんと確保されているようです。 #include <iostream> using namespace std; int main() { int num = 3 + 5; int array[num]; for (int i = 0; i < num; i++) { array[i] = i; } cout << sizeof array << endl; }
171 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:12:44 ] 正確にはC++ではなくC99で使える様になったはず
172 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:18:32 ] >>170 gccの独自拡張
173 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:25:20 ] >>168 CreateThreadはWindowsAPI、_beginthreadはCランタイム。 CreateThreadで生成したスレッドでCランタイム関数を使うとExitThreadしたときにわずかだがメモリリークが発生するため、 MSはそのような場合には_beginthreadを使うように推奨している。
174 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/17(水) 22:32:21 ] なるほど。 参考になりました。 unix - windows 互換のスレッド関係の関数は無いんですかね・・・
175 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:38:29 ] Cランタイムって何?