C++相談室 part78at TECH
C++相談室 part78 - 暇つぶし2ch1:v(^・^)v
10/02/13 23:18:03
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part77
スレリンク(tech板)

2:デフォルトの名無しさん
10/02/13 23:20:55
■基本■
[C++ FAQ]
 URLリンク(www.parashift.com)
 URLリンク(www.bohyoh.com) (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 URLリンク(www.cppreference.com) (英語)
 URLリンク(www.cppreference.com) (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
 URLリンク(www.research.att.com)
[C++ International Standard]
 URLリンク(www.iso.org)
[JTC1/SC22/WG21 - C++]
 URLリンク(www.open-std.org)
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 URLリンク(www.jisc.go.jp)
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。

3:デフォルトの名無しさん
10/02/13 23:24:24
■Libraries■
[Boost]
 Boost URLリンク(www.boost.org)
 (日本語) URLリンク(www.kmonos.net)
 (日本語) URLリンク(shinh.skr.jp)
[標準ライブラリ]
 SGI-STL URLリンク(www.sgi.com)
 STLport URLリンク(stlport.sourceforge.net)
 GNU libstdc++ URLリンク(gcc.gnu.org)
 Apache C++ Standard Library (STDCXX) URLリンク(stdcxx.apache.org)
 STLFilt URLリンク(www.bdsoft.com)
 (日本語) URLリンク(episteme.wankuma.com) (※1999年発行注意)
[Loki]
 URLリンク(sourceforge.net)
 LokiPort-MSVC6sp5 URLリンク(fara.cs.uni-potsdam.de)

4:デフォルトの名無しさん
10/02/13 23:28:14
■Books■
amazon.com C,C++関連書籍
 URLリンク(www.amazon.com)

The C++ Programming Language
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
C++ Primer (3rd Edition)
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
The C++ Standard Library
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Effective C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
More Effective C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Exceptional C++
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
More Exceptional C++
 URLリンク(www.amazon.com)
Exceptional C++ Style
 URLリンク(www.amazon.com)

5:デフォルトの名無しさん
10/02/13 23:29:23
■Books(Templateまわり)■
Effective STL
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
Modern C++ Design
 URLリンク(www.amazon.com)
 URLリンク(www.amazon.co.jp) (翻訳)
C++ Templates
 URLリンク(www.amazon.com)
C++ Template Metaprogramming
 URLリンク(www.amazon.com)

6:デフォルトの名無しさん
10/02/13 23:30:53
長いソースを貼るときはここへ。
 URLリンク(codepad.org)

7:v(^・^)v
10/02/13 23:36:05
基本のリンクは少し更新しといた。あと Libraries のリンクを復活させといた。

後は好きにして。

8:デフォルトの名無しさん
10/02/13 23:48:06
近縁スレでも貼る?

 【初心者歓迎】C/C++室 Ver.71【環境依存OK】
 スレリンク(tech板)
 初心者はこちらへ

 C言語なら俺に聞け(入門編)Part 60
 スレリンク(tech板)
 C言語はこちらへ

ぐらいか?


9:デフォルトの名無しさん
10/02/14 02:08:30
前スレの話だけど、関数テンプレートならinline付けずに
ヘッダに定義書いても全然問題ないことをどっちか片方が知らないように感じた。
俺の誤解だといいんだけど。

10:デフォルトの名無しさん
10/02/14 08:16:00
>>9 さすがにそれは無いでしょ。それだと判断基準以前の話になってるはず。

11:デフォルトの名無しさん
10/02/14 09:26:00
前スレの方が上とはけしからん

age

12:デフォルトの名無しさん
10/02/14 09:59:23
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

13:デフォルトの名無しさん
10/02/14 10:06:33
ところで現在のC++0xは
いつ頃 正式なC++になるんですか?

14:デフォルトの名無しさん
10/02/14 10:12:35
2011年10月23日2時13分25秒頃

15:デフォルトの名無しさん
10/02/14 10:19:30
VS2010はSP1で完全対応してくれるんかいな

16:デフォルトの名無しさん
10/02/14 17:31:43
>>12
地鎮乙

17:デフォルトの名無しさん
10/02/14 19:14:00
if else文で文字列のパターンを32個
チェックするのが、どうにも気持ち悪いのですが
何か別の方法はないでしょうか?


18:デフォルトの名無しさん
10/02/14 19:15:46
関数ポインタとの連想配列作るとか

19:デフォルトの名無しさん
10/02/14 19:16:36
パターンを配列に入れてループ

20: ◆GWRSHcLrd6
10/02/14 19:18:15
どうも。
スマートポインタにメモリプールを実装してみました。
(なんか保守的GCみないな感じになりましたが・・・)

まだうpしてませんが(随分汚いので)、ベンチだけ取ってみました。

21:デフォルトの名無しさん
10/02/14 19:21:35
で、ベンチは?

22: ◆GWRSHcLrd6
10/02/14 19:26:26
ループは10000, サンプリングは5で行いました。

boost::shared_ptrのベンチマーク(非スレッドセーフ)
単純な生成ループ: 15, 空ポインタに代入: 12
オブジェクトのリセット: 25, オブジェクトのコピー: 24
オブジェクトの解放: 9

framework::smart_ptrのベンチマーク(with メモリプール)
単純な生成ループ: 3, 空ポインタに代入: 12
オブジェクトのリセット: 12, オブジェクトのコピー: 12
オブジェクトの解放: 6

トータルスコア:
boost::shared_ptr: 85
framework::smart_ptr: 45

boost::shared_ptrに対する性能
単純な生成ループ: 500.0%
空ポインタに代入: 100.0%
オブジェクトのリセット: 208.3%
オブジェクトのコピー: 200.0%
オブジェクトの解放: 150.0%

全体: 188.9%

いやあ、劇的ですわ

ソースが汚いので、奇麗に書きなおせばあと10%はアップすると思います。

23:デフォルトの名無しさん
10/02/14 19:30:10
既存の実用アプリでレポ

24:デフォルトの名無しさん
10/02/14 19:30:31
まずはスマポのソースうp

25:デフォルトの名無しさん
10/02/14 20:03:40
C++ではメソッドチェーンを、あんまり使わないんだね

26:デフォルトの名無しさん
10/02/14 21:01:28
>>25
多用されてるでしょ。主にoperator系、特にストリーム操作とか。
印象は違うかもしれないけどオブジェクトのメソッドがオブジェクト自身を返して連鎖していくって意味では
まさにメソッドチェーン。

27: ◆GWRSHcLrd6
10/02/14 21:03:39
メモリプールの仕組みがこんなんなんですけど、効率のいい方法はどんなのが
あるんですか?

URLリンク(cdtest.genin.jp)

>>25
効率が悪いからでは?

28:デフォルトの名無しさん
10/02/14 21:10:01
>>27
このスマポってライセンス何なの?
まだ考えてない?

29: ◆GWRSHcLrd6
10/02/14 21:15:53
ま、まだ考えてないです・・・
ライセンスは何がいいんでしょう・・・?


30:デフォルトの名無しさん
10/02/14 21:20:00
ただの習作でしょ。
実用プログラムに組み込みたいと思ってる奴なんて要るの?

31:デフォルトの名無しさん
10/02/14 21:21:41
Googleのメモリ管理でいい。tcmallocとかいうやつ

32:デフォルトの名無しさん
10/02/14 21:21:48
アロケートしたメモリのバイト数分だけジェリービーンズで支払う

33:デフォルトの名無しさん
10/02/14 21:29:51
まだソース見ないから分からないけど
NYSLライクなら昔作ったスレッドセーフ用のスマポと比較して
性能が良かったら使おうと思った
ライブラリに合わせて改変することになるだろうからLGPLとかだと無理なんだけど
この先も色々評価して高速化するなら需要はあるんじゃね?

34:デフォルトの名無しさん
10/02/14 21:32:57
>>27
こんなの遅くて使いものにならんでしょ。
以下の問いに対して、少なくともdlmallocよりも高効率なのかよw?

こんな糞データ構造で、メモリの空き領域をどうやって効率的にさがせる
のか答えてみろよw?これじゃ単なる線形リストだろw

このスレに2度と来るないいな?わかったか?




35:デフォルトの名無しさん
10/02/14 21:35:20
>>34
>>27 の質問を良く見てみろ

36: ◆GWRSHcLrd6
10/02/14 21:35:44
>>30 >>33
まあ、これから頑張って独自性がでるようになってきたら、
ライセンスをつけたいと思います。
それまでは改変自由で(まだ大したものじゃないですしね)。

>>31
tcmalloc、ググりました。
こういうアロケートの仕方もあるんですね。
でもあれってアロケートはシステムコールとかで
バリバリにコーディングされているのかな?

ちょっとコード見てきます。

37: ◆GWRSHcLrd6
10/02/14 21:37:33
>>34
申し訳ないです・・・

38:デフォルトの名無しさん
10/02/14 21:37:45
>>34
突然どうした
ちょっと落ち着け

39:デフォルトの名無しさん
10/02/14 21:38:24
速度はたいした問題でない。既にある物より圧倒的に遅いなら別だが。
安定していて使いやすいこと。
しかしGoogleのメモリ管理もあまり流行ってないし、普及させられるほどの価値ある物は出来ないと思う。
メモリプールしても全体の速度向上はほとんど望めない。
普及させられるとしたら、boost互換のインターフェースでboostよりメリットがあること。

40:デフォルトの名無しさん
10/02/14 21:42:38
>>36
メモリ操作のみなら、Googleのメモリ管理は超速だが
実際にアプリに組み込むと何の変化も出ない。
現実アプリはメモリの生成・解放ばかりしていない。
プールはおまけにするか、Google任せにしてスマートポインタ開発のほうが
需要出ると思う。

41:デフォルトの名無しさん
10/02/14 21:54:29
Googleはこんなこともしてたのか知らんかった。
ちょっと見てみたけどtcmallocって改良版dlmallocみたいなのか。

42:デフォルトの名無しさん
10/02/14 22:48:55
>>27
線形以外の探索ってどんなのがいいのかねぇ

43:デフォルトの名無しさん
10/02/14 22:59:37
>>27
このプールから削除する場合はどうなるんだ?使い捨て?

44:デフォルトの名無しさん
10/02/14 23:04:19
>>42
最速の固定長の小メモリブロックアロケータは simple segregated storage だとわかりきっている。
探索しないでいい。

45:デフォルトの名無しさん
10/02/14 23:36:17
ヒープメモリーにヒープ構造を!w

46:デフォルトの名無しさん
10/02/14 23:50:34
boost::shared_ptrにもメモリプールを使うオプションがあったような

47: ◆GWRSHcLrd6
10/02/14 23:54:13
>>43
inner_ptrの方でゼロ初期化され、新たなアロケートで再利用されます。

というかカウント0のものはゴミとみなして新しくAllocした時にそれを使います。

で、ブロックが空、なおかつ、ブロックを多く確保しすぎている場合は
そのブロックはdeleteされて前後のブロックをリストで繋ぎます。

>>45
そうなんですよw

48:デフォルトの名無しさん
10/02/14 23:59:54
じぶんに考え。

N 十分大
char* p[0]・・・p[N] メモリブロック
メモリの使用状態を1ビットで表す 00011100010101000000
連続領域が必要なら0の連続を選択。
はじめはp[i]はNULLにしておく。


49: ◆GWRSHcLrd6
10/02/15 00:00:16
2つアロケート ↓
0001 ABCD 1234 5678, 0001 4321 DEDE 5678
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
解放 ↓
0000 0000 0000 0000, 0001 4321 DEDE 5678
~~~~~~~~~~~~~~~~~~~
アロケート(再利用) ↓
0001 0123 2567 ABAB, 0001 4321 DEDE 5678
~~~~~~~~~~~~~~~~~~~
アロケート(ブロック追加) ↓ ブロック2をnew
0001 0123 2567 ABAB, 0001 4321 DEDE 5678
0001 0CCC 1224 5555, 0000 0000 0000 0000
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
解放 ↓
0001 0123 2567 ABAB, 0001 4321 DEDE 5678
0000 0000 0000 0000, 0000 0000 0000 0000
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
不必要と判断、ブロック2をdelete
0001 0123 2567 ABAB, 0001 4321 DEDE 5678

50:デフォルトの名無しさん
10/02/15 00:00:37
>>47
いったい何を目指しているの?

メモリブロック確保の速度なんて operator new の実装に任せておけばいいこと。
そんなところをがんばるよりも、他にすることは無いの?

51: ◆GWRSHcLrd6
10/02/15 00:01:08
って感じです。

52:デフォルトの名無しさん
10/02/15 00:02:15
カオス

53: ◆GWRSHcLrd6
10/02/15 00:02:56
>>50
すいません。高速化しようと思って少しそれてしまいました・・・

54:デフォルトの名無しさん
10/02/15 00:03:49
マルチスレッドでメモリ探索にロック掛けると速度落ちると思うから
キューに入れて順番に処理すると良い思うが、キューへのアクセスにロックが必要
ロック無しにする方法ないか。

55:デフォルトの名無しさん
10/02/15 00:05:52
wait-free lock-freeのwikiみると、アトミック命令使えばロック無しのマルチスレッドできるらしいが。


56:デフォルトの名無しさん
10/02/15 00:07:06
operator new よりGoogleメモリ管理の方が高性能。

57:デフォルトの名無しさん
10/02/15 00:08:51
>>54 URLリンク(www.google.co.jp)

58:デフォルトの名無しさん
10/02/15 00:09:43
>>56
なら operator new を Google メモリ管理で置き換えればいいじゃない。

59:デフォルトの名無しさん
10/02/15 00:23:34
>>57
実装方法わからん。cas命令らしいけど

60:デフォルトの名無しさん
10/02/15 00:46:42
マルチコア時代のLock-free入門
URLリンク(www.slideboom.com)
これによると std::shared_ptr (C++0x) はとてつもなく遅くて使えんとあるな。
だから Hazard ポインタを使えともある。

61:デフォルトの名無しさん
10/02/15 01:01:25
>>60
スマートポインタでLock-freeにするには? という話なのに、
Lock-freeを実現するために使用するスマートポインタの話をするのは順番が逆でしょう。

でも >>60 のような用途に使える軽快なスマポは確かに欲しいけど。

62:デフォルトの名無しさん
10/02/15 01:14:46
CAS命令は結構コストかかるのよ。
可能なら、RCU的な手法にする方が良い。

URLリンク(www.atmarkit.co.jp)
みたいな記事もある。

63:デフォルトの名無しさん
10/02/15 23:47:17
RCUってなあに?

64:デフォルトの名無しさん
10/02/15 23:48:21
正直
マルチコア時代
を相手にするならスマポのコストが問題となることは
大抵ないと思うんだが。


65:デフォルトの名無しさん
10/02/15 23:49:25
>>63
記事の中よめよ
リンク先にまるなげだけどちゃんとあるだろう
URLリンク(ja.wikipedia.org)

66:デフォルトの名無しさん
10/02/15 23:55:18
で、依存無しのCASとかRCUとかはどう実装するんだ?

67:デフォルトの名無しさん
10/02/16 00:06:35
無理無理

68:デフォルトの名無しさん
10/02/16 00:59:05
>>64
マルチコア関係なくね?

69:デフォルトの名無しさん
10/02/16 01:48:54
>>64
おい!

70:デフォルトの名無しさん
10/02/16 08:04:43
通信系の処理プログラムを書いてるんですが
処理担当スレッドを作る場合、必要になったらbeginthread(もしくはbeginthreadex)で
スレッドを起動して作業が終わったらおしまいとするのとスレッドプールをするのでは
どちらがいいのでしょうか?

71:デフォルトの名無しさん
10/02/16 13:05:40
>>70
頻繁に起動終了を繰り返すようなものならスレッドプールが良いと思うよ。
スレッドの生成破棄もコストはあるからね。

72:デフォルトの名無しさん
10/02/16 15:32:45
getter/setterについて悩んでいます。

●getterについて
・setterに対してgetterも用意されていたら、隠蔽になっていないのではないか?
・利用者がsetした時の情報を保持すればgetterはいらないのではないか?
●setterについて
・コンストラクタの引数で受け取る物は、setterも用意したくなるが同じ機能を2箇所に書いている感が?

書いたクラスが各メンバ変数に対してgetter/setterが存在する物になっていると、
無駄に手間をかけただけの構造体なんじゃないかと不安になります。
必要十分なgetter/setterを持つクラスを設計するには、どういう事を考えればいいのでしょうか?

73:デフォルトの名無しさん
10/02/16 15:45:03
>>72
>・setterに対してgetterも用意されていたら、隠蔽になっていないのではないか?

なんでそうなる
他にもいろんなprivate変数持ってる場合がほとんどだろ

74:デフォルトの名無しさん
10/02/16 15:54:44
>>73
「コンストラクタも含めて外部からget/setされないメンバ変数」を持たないクラスも多いです。
10個近くの設定値が必要なクラスとか、コードのうちgetter/setterが占める割合が多くなって、「なんだかなー」と思います。

75:デフォルトの名無しさん
10/02/16 15:59:39
そう思うなら思い切ってpublic変数にすればいいだろ
でもgetter/setterを敢えて持つ理由は、プログラマに「今private変数を
いじってますよ」という事を常に意識させる効果がある

76:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/16 16:39:05
>>75
一貫性がないのは嫌なので、public変数にするとなると全てのクラスをpublic変数にする事になって、これも嫌な感じがします。

>>76
確かに隠蔽性がなくなるわけではありませんでした。
インターフェイスがすっきりしないのが嫌なところですね。

設定値が多い時は、構造体に纏めてget/setするという事ですね。

78:デフォルトの名無しさん
10/02/16 17:08:13
そのたくさんある変数はすべてset/getする必要があるの?
内部実装のためにあるデータだってあるでしょ

外部から見たときにset/getする必要があるやつだけ
publicなsetter/getterを定義すればいいよ

79:デフォルトの名無しさん
10/02/16 17:30:04
vectorにクラスを入れるということは普通しないのでしょうか?

80:デフォルトの名無しさん
10/02/16 17:30:44
よくやる

81:デフォルトの名無しさん
10/02/16 17:37:08
むしろやらないでどうする

82:デフォルトの名無しさん
10/02/16 17:40:03
>>79
とても若干良くある
クラスのコピーコストが気になるレベルならポインタ格納するなりlist使うなりするけど。

83:デフォルトの名無しさん
10/02/16 17:49:29
>>60
明確な実装方法を表したサイトってないの?

84:デフォルトの名無しさん
10/02/16 17:51:39
クラスを入れる、っていう表現がまかり通るのが驚き。

85:デフォルトの名無しさん
10/02/16 17:58:08
>>83
そんなものはない!

86:デフォルトの名無しさん
10/02/16 18:03:51
#define class struct
オヌヌメ

87:デフォルトの名無しさん
10/02/16 18:09:34
>>71
なるほど
ちなみにスレッドプールしておいたスレッドの空き/使用中の管理というのは自分でやる必要があるのでしょうか?

88:79
10/02/16 18:25:17
よくやるんですね。ありがとうございます。
自分のプログラムで変なエラーが出てしまったので、もしかしたら間違ったやり方をしているのかと思いました。
できるんなら、何とかしてみます。

89:デフォルトの名無しさん
10/02/16 18:35:46
たぶんコピー、代入あたりで間違えてるんだろうな

90:デフォルトの名無しさん
10/02/16 18:43:27
pimplを勧める

91:デフォルトの名無しさん
10/02/16 18:45:18
#undef class

92:デフォルトの名無しさん
10/02/16 19:00:34
>>87
beginthread云々からWin32と仮定すると
IOCPに管理させるのが楽かもよ。

93:デフォルトの名無しさん
10/02/16 20:48:19
POSIXじゃないの?

94:デフォルトの名無しさん
10/02/16 21:25:46
おめーはpthreadも知らずWin32も知らないのか

95:デフォルトの名無しさん
10/02/16 22:00:15
誰に言ってるんだ?

96:デフォルトの名無しさん
10/02/16 22:12:52
誰が?

97:デフォルトの名無しさん
10/02/16 22:22:49
ワッフルワッフル

98:97
10/02/16 22:23:48
誤爆しました。

99:デフォルトの名無しさん
10/02/16 22:24:19
え?

100:デフォルトの名無しさん
10/02/16 22:25:08
ww

101:デフォルトの名無しさん
10/02/16 22:38:45
うむ。苦しゅうない。

102:デフォルトの名無しさん
10/02/17 00:38:25
何の?

103:デフォルトの名無しさん
10/02/17 01:05:07
>>53
以前メモリプール使用のスマポで計測結果張ったものですが、こんなメモリプールつこてます。
URLリンク(codepad.org)
メモリ的にも処理的にも無駄を減らした実装でまだまだシンプルですが、使えるポイントはあると思います。

104:デフォルトの名無しさん
10/02/17 01:11:05

int get()
{
return mVal;
}

これよりも効率よくmValを外部に返す方法ってありますか?

105:デフォルトの名無しさん
10/02/17 01:17:18
>>72
まずインターフェースだけ考える。どんな変数を持ってるとかは敢えて考えないぐらいのつもりで、
とにかく利用者にとって自然な操作だけをメンバ関数(コンストラクタ含む)として列挙する。

それが済んでから、それらのメンバ関数を実装するための変数を必要なだけそろえる。

これなら「隠蔽になっていない」などという心配は起こりようが無いし、余計なコードも発生しない。

インターフェースを考える段階で、利用者から見て中にどんなデータが入っているのか
明らかでありメンバ関数呼び出しが煩雑なだけに見えるようなら、ただの構造体でいい。

106:デフォルトの名無しさん
10/02/17 01:38:40
>>103
Test継承したら使えないジャマイカ

107:デフォルトの名無しさん
10/02/17 02:06:51
>>104 ねーよjk

108:デフォルトの名無しさん
10/02/17 02:13:11
>>104
#define get() mVal

foo.get();

109:デフォルトの名無しさん
10/02/17 04:46:59
スレッドセーフなキューが作れれば全てのマルチスレッドは統一的に扱えるはず
とおもって探した。
lock-free wiat-freeかはしらないがこれ。無料だとこれくらいかと。

Thread Safe Template Library
URLリンク(sourceforge.jp)

IntelR Threading Building Blocks
URLリンク(www.threadingbuildingblocks.org)


110: ◆GWRSHcLrd6
10/02/17 07:22:13
>>103
あ、なんか僕が今作りなおしているやつも似た作りです。
これが効率よさそうですよね。

そういえばboostのsimple_segregated_storage(だっけ?)ってどういう仕組み何でしょうか?

>>109
なるほど。ちょいと見てみます

111:デフォルトの名無しさん
10/02/17 10:38:15
可変長引数パラメータて、使いどころがよくわからないんですが
どういった時に使うんでしょうか?
同じようなことができるboostのfunctionもです。

掴み所を教えてください

112:デフォルトの名無しさん
10/02/17 10:58:46
>>111
可変長引数パラメータって何?
関数引数の ... のこと?

113:デフォルトの名無しさん
10/02/17 11:23:46
>>112
そうです。
使い方はわかるし、boostも使い方は理解できるんですが
何に使うのかがわからないんです。

特に後者のboostは、仮想関数の引数としてfunctionを利用しても
結局テンプレートだからオーバーロードになるわけですよね?
呼び出し側で型指定するわけですし、多態的に動作させるのもできないのでは?

ここで混乱している感じです。

114:デフォルトの名無しさん
10/02/17 11:26:48
>>113
printf() とか。
まぁ C++ では基本的に使わないな。

boost::function とは関係ないと思うけど、何のこと言ってんの?

115:デフォルトの名無しさん
10/02/17 11:32:54
>>114
返り値の型、引数の型を指定して関数ポインタを楽に生成できるじゃないですか。

このテクニックを利用して、引数の数、型が変化する処理を多態的にさせたいんです。

116:デフォルトの名無しさん
10/02/17 11:43:01
>>113
可変長引数に関しては>>114に同じくprintfがいい例だと思う。
可変長引数は、C++ではあまり推奨おらず、printfに関してもboost::formatを使った方がいい。
URLリンク(www.kmonos.net)

boost::functionに関しては、引数の型(個数も含む)が違えば、boost::functionの型も変わる(boost::functionはクラステンプレートであってクラスそのものではない)。
テンプレートによる静的多態なので、仮想関数の動的多態のようには扱えない。

117:116
10/02/17 11:55:42
付け加えておくと、
・可変長引数とboost::functionの使いどころは別である
・boost::functionは関数ポインタを使いやすくした物

あと、>>116の最後の行は紛らわしい書き方だった。
boost::functionの1つの具現化(戻り値と引数の型が同じ)においては、関数ポインタによる動的多態である。

118:デフォルトの名無しさん
10/02/17 12:11:45
>>117
なるほど!
多態とはまた別物なんですね。
ボリモルフィズムが一気に広がるかもと思ったんですがね。

ありがとうございました。

119:デフォルトの名無しさん
10/02/17 12:22:49
>>115
boost::function<void ()> で、引数は全部 bind するとか、
boost::function<void (std::vector<boost::any> const&)> で引数について型消去しながらやりくりするとか。

120:デフォルトの名無しさん
10/02/17 13:01:27
(´;ω;`)さ、さ、さむいお

121:デフォルトの名無しさん
10/02/17 13:22:58
利用者が仮想関数を呼び出す時、仮想関数の実装を知らなけば引数を渡せなくなって、ポリモーフィズムのメリットがなくなる気がするけど。

122:デフォルトの名無しさん
10/02/17 14:15:09
いらない

123:デフォルトの名無しさん
10/02/17 15:13:58
非ブロッキング、ロックフリー、ウェイトフリーの定義

URLリンク(www.gameenginejp.com)

124:デフォルトの名無しさん
10/02/17 15:37:29
スレッドセーフのSTLクラスは使えるな。
boostのどのライブラリより上では。
boostにこんなのないだろ。

125:デフォルトの名無しさん
10/02/17 15:45:26
ありますがな・・・

126:デフォルトの名無しさん
10/02/17 15:46:17
ありませんがな・・・

127:デフォルトの名無しさん
10/02/17 15:50:33
TBBの日本語サンプルサイトつくってくれよ。
マルチコア時代で、CPUメーカー製の、フリーのこのライブラリは強力すぎる。
できたら毎日クリックしに行くからさ。

URLリンク(ja.wikipedia.org)

抜粋

並列処理アルゴリズム
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:デフォルトの名無しさん
10/02/17 16:13:42
サンプルはないけど日本語リファレンスあるし間に合ってる感じ

129:デフォルトの名無しさん
10/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);
}

URLリンク(hp.vector.co.jp)

130:デフォルトの名無しさん
10/02/17 18:58:30


8スレッド
InterlockedIncrement 4.398sec
InterlockedCompareExchange 4.460sec
CriticalSection 6.297sec
URLリンク(d.hatena.ne.jp)

VC++ CriticalSectionの速度
何もないループが、0.515106秒に対しクリティカルセクションでは7.089556秒となった。
URLリンク(www.cycleof5th.com)


同期オブジェクトの要約
速度
クリティカル セクション 高
ミューテックス 低
セマフォ 低
イベント 低
メータード セクション 高
URLリンク(msdn.microsoft.com)



131:デフォルトの名無しさん
10/02/17 19:08:05
スレッドセーフなキューを複数個用意してキューにデータ来たら、
それぞれ直列に動作する関数を動かしたいんだけど
作業が終わったらキューを観察に行くけど無かった場合、次に入ってくるまで
どうやってまてばいいんだ? ひとつとしてビジーループはあるが。
それなら別変数用意してロック掛けた方が良い。ロック無しで出来る?
キューは一カ所にしてすべての処理関数スレッドで共有する方が無駄ないか。

132:デフォルトの名無しさん
10/02/17 19:22:53
キューに挿入する側が、余りのスレッドを監視して空いてたら処理させればいいか。
これならロック無しでアトミック命令だけでいけそう。

133:デフォルトの名無しさん
10/02/17 19:24:54
しかしスレッドを生成するコストも馬鹿にならないから
スレッドの生成・消滅はせず、恥に生成したやつを使い回したいところ。
やっぱロックいるか。処理終了してキュー待ちのロック。

134:デフォルトの名無しさん
10/02/17 19:27:47
スレッドの生成は恥

135:デフォルトの名無しさん
10/02/17 19:41:16
wait付きのビジーループでいいか

136:デフォルトの名無しさん
10/02/17 20:32:25
C++でコルーチンってできないの?

137:デフォルトの名無しさん
10/02/17 20:32:53
boostにあるにょ

138:デフォルトの名無しさん
10/02/17 20:35:08
あるんだ
boostまじ何でもあるな
奴らはいったい誰と戦ってるんだ

139:デフォルトの名無しさん
10/02/17 20:37:11
言われてみるとその言葉かなりしっくりくるよな。
C++の最適化に伴う変態記法なんて禿に親を殺されでもしない限りできないし。

140:デフォルトの名無しさん
10/02/17 20:39:02
>>138
部品の足りない世界じゃないの?

というかWTLもC#並に充実させてください

141:デフォルトの名無しさん
10/02/17 20:45:06
駆動系の部品はハイスペックだが
シートもハンドルもなく部品丸出しの車

142:デフォルトの名無しさん
10/02/17 20:47:45
C++はC++です車ではありません
好い加減な比喩は滑稽なのでやめてください

143:デフォルトの名無しさん
10/02/17 20:48:41
コルーチン
URLリンク(ja.wikipedia.org)

Boost C++の何て言うライブラリで出来るのですか?

144:デフォルトの名無しさん
10/02/17 20:49:43
boost.cotoutine
vaultにあるにょ

145:デフォルトの名無しさん
10/02/17 20:52:04
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

146:デフォルトの名無しさん
10/02/17 20:52:32
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

147:デフォルトの名無しさん
10/02/17 20:52:41
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

148:デフォルトの名無しさん
10/02/17 20:53:21
車への例えがどれも的外れでワロスw

149:デフォルトの名無しさん
10/02/17 20:53:33
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

150:デフォルトの名無しさん
10/02/17 20:55:48
だからといってヨソの車がそんなに安全かというと……

151:デフォルトの名無しさん
10/02/17 20:57:31
>>144
valtですか。
ありがとうございます。


152:デフォルトの名無しさん
10/02/17 20:58:22
Boost.Coroutine
URLリンク(hamigaki.sourceforge.jp)

2009-12-12 - melpon日記 - C++すら(ry
Boost][C++]Boost.勉強会の資料
URLリンク(d.hatena.ne.jp)
URLリンク(melt.sytes.net)
・Boost.Fiber という対抗馬も最近出てきた


153:デフォルトの名無しさん
10/02/17 20:59:10
理想的には部品丸出しではないが、
バカが作ると部品を理解していなければならなくなる
仕様だな。


154:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/17 21:08:51
0から1000まで足すだけ。キューへマルチスレッドでpush、popして
読み取って空いてるスレッドが足し合わせていくサンプル。
答えは合ってたよ。

156:デフォルトの名無しさん
10/02/17 21:10:28
キューではロックしているだろうがな。そこを自作せずに済んだという話だ。

157:デフォルトの名無しさん
10/02/17 21:20:49
プログラム組んでて
returnって打ったつもりだったら

tryit,

って打ってた
なんか感動した

158:デフォルトの名無しさん
10/02/17 21:21:46
rをtにずらして打ってみると・・・!?

159:デフォルトの名無しさん
10/02/17 21:22:04
ゴルゴはtrycatchfinallyを0.5秒でタイプするらしい

160:デフォルトの名無しさん
10/02/17 21:23:35
>>157
夢を感じた

161:デフォルトの名無しさん
10/02/17 21:33:09
HDL ではごく普通というか大前提の話なんだが
直列処理という枠に凝り固まった頭で見ると驚きの連続なんだろうな

162:デフォルトの名無しさん
10/02/17 21:39:17
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

163:デフォルトの名無しさん
10/02/17 21:40:28
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

164:デフォルトの名無しさん
10/02/17 21:42:11
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

165:デフォルトの名無しさん
10/02/17 21:45:58
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

166:デフォルトの名無しさん
10/02/17 21:46:42
パラメータになんか持たせるとか

167:デフォルトの名無しさん
10/02/17 21:57:56
なにを?

168: ◆GWRSHcLrd6
10/02/17 22:01:15
_beginthreadとCreateThreadは何が違うんですか?
というかどっちを使った方がいいんですか?

169:デフォルトの名無しさん
10/02/17 22:07:13
>>167
判断できる情報を

>>168
適材適所。常にどちらかがよいということはない

170:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/02/17 22:12:44
正確にはC++ではなくC99で使える様になったはず

172:デフォルトの名無しさん
10/02/17 22:18:32
>>170
gccの独自拡張

173:デフォルトの名無しさん
10/02/17 22:25:20
>>168
CreateThreadはWindowsAPI、_beginthreadはCランタイム。

CreateThreadで生成したスレッドでCランタイム関数を使うとExitThreadしたときにわずかだがメモリリークが発生するため、
MSはそのような場合には_beginthreadを使うように推奨している。


174: ◆GWRSHcLrd6
10/02/17 22:32:21
なるほど。
参考になりました。

unix - windows 互換のスレッド関係の関数は無いんですかね・・・

175:デフォルトの名無しさん
10/02/17 22:38:29
Cランタイムって何?

176:154
10/02/17 22:41:42
修正。引数渡す場所間違えて一スレッドしか動いていない。
#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;
#define N 3
concurrent_queue<int> que;
int s[N];
unsigned WINAPI fnc(void *n) {
int x,num=(int)n;
while(1) {
if( !que.try_pop(x) ) { Sleep(100); continue; }
if(x==-1){ cout<<"正常終了number:"<<num<<endl; return 0;}
s[num]+=x;Sleep(rand()%50); }}

int main() {
HANDLE hd[N];
int n;
for(n=0; n<N; n++) s[n]=0;
for(n=0; n<N; n++) hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL);
for(n=0; n<=50; n++) que.push(n);
for(n=0; n<N; n++) que.push(-1);
WaitForMultipleObjects(N, hd, TRUE, INFINITE);
int sum=0;
for(n=0; n<N; n++) {cout<< "スレッド"<<n <<"の合計 "<<s[n]<<endl; sum+=s[n]; }
cout<<"総和 "<<sum<<endl;
getchar(); }

177:デフォルトの名無しさん
10/02/17 22:44:40
>>174
pスレッド windowsというのがあるが、おすすめしない。
一度にアクセスが起きるとバグった経験有り。同じ物をwindowsの命令に書き換えたら動いた。
スレッドのどれか一つ or全部の終了待ちがない気がする。

178:デフォルトの名無しさん
10/02/17 22:47:23

Open Source POSIX Threads for Win32
URLリンク(sourceware.org)


179:デフォルトの名無しさん
10/02/17 22:51:55
一時期windowsであっても、linuxの互換コードで書くべきだという考えが起こり
全て統一しようとしたがPthread for winがうまく動作しないので諦めた経験ある。
現在の環境で生産性の良い、短いコードで済ますのが一番という考えになった。
完成品が出来なければ意味ない。完成していれば他OSへも移植しやすい。




180:デフォルトの名無しさん
10/02/17 23:00:42
QtやBoostその他 ラッパライブラリじゃできないの?


181:デフォルトの名無しさん
10/02/17 23:02:56
Qtもboostも標準にはいってないじゃん
サイズもでかいし
linuxでどこでも使えるのはPthreadだけでは

182:180
10/02/17 23:07:16
>>181
その方、Pthreadはいつから標準になったと申すか。

183:デフォルトの名無しさん
10/02/17 23:09:31
POSIX Threads, or Pthreadsのライセンスは
This implementation is free software, distributed under the GNU Lesser General Public License (LGPL).

え?誰も聞いてないって?


184:デフォルトの名無しさん
10/02/17 23:13:49
入ってないlinuxはないんでは。c/c++がコンパイル可能な環境なら。

185:デフォルトの名無しさん
10/02/17 23:16:36
標準っていうか、プリインストールって言いたかったわけか。


186:デフォルトの名無しさん
10/02/17 23:18:22
ち、違うよ。

187:デフォルトの名無しさん
10/02/18 00:57:43
どっちもbccでうごかん。 
lock-freeの高速キューを作ってくれよ。
インラインアセンブラ・マクロの特殊構文の多用が原因と思われる。
windows 標準のcas命令のみで頼む。

Thread Safe Template Library
URLリンク(sourceforge.jp)

Intel Threading Building Blocks
URLリンク(www.threadingbuildingblocks.org)

188:デフォルトの名無しさん
10/02/18 01:43:02
bccなんてポンコツ捨てろよ

189:デフォルトの名無しさん
10/02/18 04:41:14
bccは毎年新規で販売してるんだぞ。
コンパイル速度速くて良いんだこれは。

190:デフォルトの名無しさん
10/02/18 04:49:50
httpサーバーなどへIf-Modified-Sinceをつける場合statでファイルの更新日付を
取得してどのように変換すればいいのでしょうか?

日本時間に直すサンプルは見かけるのですがGMTのまま文字列化する方法が
わかりません

191:デフォルトの名無しさん
10/02/18 08:08:13
スレッドセーフキューがマルチスレッドの要なんです
マクロやアセンブラ使わずに書いてくれると喜ばれますよ

192:デフォルトの名無しさん
10/02/18 08:22:15
STLportがスレッドセーフなSTLだった
これつかお

193:デフォルトの名無しさん
10/02/18 11:43:35
わざわざいうな

194:デフォルトの名無しさん
10/02/18 15:34:49
>>190
strftimeじゃできないの?

195:デフォルトの名無しさん
10/02/18 19:14:32
プロの方はスマートポインタを使うのが基本とのことですが、例えば引数なんかも
hoge( shared_ptr<Test>& sp )といったかんじになるんでしょうか?
それとも受け渡しは生のポインタで行い、オブジェクト側でスマートポインタに格納ような
使い方ですか?

196:デフォルトの名無しさん
10/02/18 19:44:09
参照渡しだよ

197:デフォルトの名無しさん
10/02/18 20:07:01
STLportがbccでコンパイルできん

198: ◆GWRSHcLrd6
10/02/18 20:43:01
>>195
僕はクラスのメンバ関数が前提なら、
関数を所有するクラスがオブジェクトをメンバ変数に保持するときはスマートポインタを、
一時的に使うだけなら参照で渡します。

>それとも受け渡しは生のポインタで行い、オブジェクト側でスマートポインタに格納ような
一番やっちゃいけない気がするんですけど・・・


199:デフォルトの名無しさん
10/02/18 21:44:30
>>171 >>172
アドバイスありがとうございます。
手元のどの参考書見ても変数は使えないと書いてあってあれ?と思っていたしだいです。
Visual C++で使えないようなのでgccだけなんですね。

200:デフォルトの名無しさん
10/02/18 22:19:13
>196 >19
ありがとうございます。
今試してみましたが同一ポインタを複数のshared_ptrに格納すると、
shared_ptrの数だけデストラクタが呼ばれてしまうんですね。
基本は参照で複製を作らないようにするということですね。

201:デフォルトの名無しさん
10/02/18 22:21:29
>>200
そう。
RAIIを徹底しろ。

202:デフォルトの名無しさん
10/02/18 22:21:59
失礼しました。
>>196 >>198でした。

203:デフォルトの名無しさん
10/02/18 22:22:59
g++やVC++などの有名どころのC++コンパイラについてお聞きしたいのですが、
コンパイル時定数を使った
URLリンク(codepad.org)
こんなifによる分岐があるとします。

このとき、成果物.exeはちゃんと最適化されて
分岐が消えるのでしょうか?

よろしくお願いします。


204:デフォルトの名無しさん
10/02/18 22:25:05
codepadで使ってるg++とVC9.0では消失を確認

205:デフォルトの名無しさん
10/02/18 22:36:54
ありがとうございます。
const bool ctc = 100; // compile-time constants

bool ctc = 100; // NOT compile-time constants
にしても同じでしょうか?
(volatileは付けません。)

お手数をおかけ致しますが、よろしくお願いします。



206:デフォルトの名無しさん
10/02/18 22:50:06
const bool ctc = 100; // compile-time constants
に関しても同じ(キャストはちゃんとした方がいい)。
そもそも実行時への互換性を保たないと最適化というのはできないからね。

bool ctc = 100; // NOT compile-time constants
でも、単純にctcへの変更が無い事から最適化がなされた(204と同じ環境で)。
ただ、このケースは後のコードに完全に依存しているから考察する価値はあるのかどうか疑問だな。

207:205
10/02/18 23:02:24
>>206
ご教示ありがとうございます。

そういったことは、どうやって調べればよいのでしょうか?
.asmを出力して調べているのでしょうか?


208:デフォルトの名無しさん
10/02/18 23:05:31
>>207
そうだよ。

209:デフォルトの名無しさん
10/02/18 23:08:17
YOUバイナリ読んじゃいなYO

210:デフォルトの名無しさん
10/02/18 23:08:49
>>208
ありがとうございます。
asmからは逃げ回ってきているので全然読めそうにありません。
勉強しなければなりませんね。。。

211:デフォルトの名無しさん
10/02/18 23:09:33
別に勉強しなくても片手間にasmの命令リストと見比べてるだけだけどね。

212:デフォルトの名無しさん
10/02/18 23:15:53
asmってコンパイラやアセンブラによって
扱いが違うからやだ

213:デフォルトの名無しさん
10/02/18 23:16:19
なんかアセンブリって難しそうなイメージある
低級だから追いかけるのが大変なだけで難しい構文とかはむしろ少ないんだろうけど・・・

214:デフォルトの名無しさん
10/02/18 23:21:24
アセンブリ自体は簡単だけど、他の言語で出来ることをアセンブリでするとか考え出すと難しい

215:デフォルトの名無しさん
10/02/18 23:23:20
アセンブリで全部済むならプログラミング言語なんて必要ないわけで

216:デフォルトの名無しさん
10/02/18 23:27:53
そう考えるとC言語とか
移植性もあってすげえ言語だな。
今更だけど。



217:デフォルトの名無しさん
10/02/19 00:45:23
>>216
cが優秀じゃなくてcコンパイラ作った人が優秀なだけだな

218:デフォルトの名無しさん
10/02/19 01:11:59
規格作ったやつだ。
Cコンパイラは、上司が監視して下っ端が要求通り作ってるだけ。
初めの設計図が一番。
たとえば、アニメは動画マンという超低賃金のやつらがやっているが
宮崎駿や原作漫画家がいるから開発できるんだ。

219:デフォルトの名無しさん
10/02/19 01:18:03
>>218
現存するコンパイラは確かに規格ありきで作り始めてそうだけど、元々は
たくさんの環境向けに作られていた C の共通部分を元に規格化されたんだから、
先にコンパイラ作ってた人が下っ端ということはないだろう。

220:デフォルトの名無しさん
10/02/19 01:33:47
>>219
まあ初期のC言語確立やコンパイラ作ったような人たちは
上も下もねーだろうな
小さいチームで多少リーダー的存在がいるくらいだろうし
そういう中で試行錯誤しながらとかだろうし

その後の各環境ごとのコンパイラ開発はC言語そのものがあるんだし
それにあわせちゃえばいいので作業だろうな
(でもそれなりに知識は要るので下っ端ってわけじゃないだろうけど

221:デフォルトの名無しさん
10/02/19 02:48:53
>195
そんな渡し方したら危険じゃない?


222:デフォルトの名無しさん
10/02/19 05:22:11
ファイルIO( open close load)がかなり時間かかるから
要求を並列で出しておくと時間短縮するね。
細かい多数のファイルで2倍-3倍くらいの向上。

223:デフォルトの名無しさん
10/02/19 06:34:44
5倍を目指してくれ

224:デフォルトの名無しさん
10/02/19 07:29:30
files=20

225:デフォルトの名無しさん
10/02/19 12:47:04
dmr にあやまれ。

226:デフォルトの名無しさん
10/02/19 14:45:10
How many files(0-15)?■

227:デフォルトの名無しさん
10/02/19 15:58:57
じじい乙

228:デフォルトの名無しさん
10/02/19 17:54:32
ここの人ってワイルドカード欲しい時に何使ってるの?
boost使ってる人なら正規表現なんだろうけど、
使って無い人が気になる。

229:デフォルトの名無しさん
10/02/19 18:03:44
windows api か
正規表現で代用

230:デフォルトの名無しさん
10/02/19 18:21:07
俺は魔法だなあ

231:デフォルトの名無しさん
10/02/19 21:12:55
そもそもワイルドカードと正規表現がどうつながるんだ?

232:デフォルトの名無しさん
10/02/19 21:14:55
ワイルドカードでできる事は正規表現でできるだろ

233:デフォルトの名無しさん
10/02/19 21:31:27
C++ でできる事はアセンブラでもできるんだが
そういう問題ではあるまい?

234:デフォルトの名無しさん
10/02/19 21:33:36
何を言ってるんだ…

235:デフォルトの名無しさん
10/02/19 21:36:52
ポインタが使える人、暇な人に質問です。
下のコードはメモリの確保と解放がきちんとなされてるでしょうか?
URLリンク(codepad.org)

236:デフォルトの名無しさん
10/02/19 21:39:35
異常なし

237:デフォルトの名無しさん
10/02/19 21:45:42
暇な人とは失礼な

改めていわれなくてもこんなところ見てる段階で暇・・・

238:デフォルトの名無しさん
10/02/19 22:05:30
>>233
正規表現が無い環境だってあるじゃない。
外部ライブラリも不可とか。
その例で言うとC++が使えない環境という事。
「C++使えないなんてあるわけないじゃん」とは言えまい?

239:デフォルトの名無しさん
10/02/19 22:10:36
>>238
C++使えないって、組み込み系とかですか?
なんかろくなコンパイラがないってことなんでしょうか。

240:デフォルトの名無しさん
10/02/19 22:19:26
>>239
例えばの話です。
組み込み系なんてサッパリ^O^

241:デフォルトの名無しさん
10/02/19 22:23:34
なんで2つの言葉のつながりから、環境がどうこうの話になるんだ。
話の流れ方に病的なものを感じる。

242:デフォルトの名無しさん
10/02/19 22:24:52
病的っていうか、知ったばかりの単語を中学生が使いたがってるだけな雰囲気

243:デフォルトの名無しさん
10/02/19 22:26:19
>>238
あったねー、OS にワイルドカードがなくてアプリが独自にサポートしてたケース
アプリごとに微妙に解釈が違ってて脱力ずっこけが何度もあった

>>239
C++ 自体はどのシステムにでも使えるぞ、C++ で HEX や HDL が作れるわけで

244:デフォルトの名無しさん
10/02/19 22:26:46
>>235
パッと見だがリークすると思う

t = new Test;
を解放してない

delete t;
が必要じゃない?

245:デフォルトの名無しさん
10/02/19 22:28:24
聞く前にop new/deleteでカウントするぐらいはやってみようよ

246:235
10/02/19 23:07:57
>>244
見落としてました。
>>245
new、deleteをオーバーライドってことでしょうか?
やってみます。

どうもありがとです。

247:デフォルトの名無しさん
10/02/19 23:49:29
Test *New(int index0,int index1,int index2);
の途中で失敗した場合のリークも


248:デフォルトの名無しさん
10/02/20 01:39:58
worker threadパターンを実装したいので
既存の関数を実効させる部分をテンプレートで
実装したいのですが、どのように書けばいいのか
わかりません。

たとえば、f1、f2、f3を同じworke threadクラスで
扱うにはどのようにコーディングするのが正しいのでしょうか

249:デフォルトの名無しさん
10/02/20 01:47:04
スレッドを起動させっぱなしにするのがワーカースレッドっていうのか。

>>176のunsigned WINAPI fnc(void *n);もワーカースレッドだな。参考にしてくれよ。

250:デフォルトの名無しさん
10/02/20 01:48:51
>>176は一つのキューに挿入と取り出しを行い、3スレッド並列で空いたら
スレッドからデータを取り出し処理を行う。

251:デフォルトの名無しさん
10/02/20 01:51:15
キューが貯まったら各関数に通知したら、ビジーループを防げるけど
面倒なので100ms毎に確認しに行くようになっている。

252:デフォルトの名無しさん
10/02/20 11:59:32
プログラムする時のやり方聞きたいんだが
いきなり書き始める?
きっちり考えて書く?
書き始めたとしても、ヘッダでインラインで書きまくって、動作したらcppと分割する?
それとも最初からわけて書く?

253:デフォルトの名無しさん
10/02/20 12:28:31
自分の場合大まかな方針は決めてから書く
ただ、確実にこれはいるなってデータや関数は
あまり考えないでも書く

ヘッダにインラインで書くのはコンパイル時間との兼ね合い
大きいプログラムを書くときは最初から分ける

俺のオススメは
2回同じことを書くまでは出来るだけ抽象化しない
逆に2回同じことを書いた時点で必ず抽象化する
こうすると、バグの発生源が重複しないので大分バグをつぶしやすくなる
ただ、多人数での開発には使いにくいだろうが

254:デフォルトの名無しさん
10/02/20 12:30:19
>>252
まず絶対UMLとシーケンス図を書く
その後細かいところはフローチャートを書く
2、3時間でできることだから必ず行う

その後1回で製造する。



255:デフォルトの名無しさん
10/02/20 12:42:07
>>252
いきなり書く。
パフォーマンスを計る。
もう一度書く。
ライブラリ化する。


256:デフォルトの名無しさん
10/02/20 12:51:21
いきなり書くやつは下っ端だな。与えられる仕様をただこなすだけ。
ビル・橋・道路の設計者ではなく、日雇いの土木作業員。

257:デフォルトの名無しさん
10/02/20 12:58:58
まぁ、いきなり「本番」のコードを書くのは無謀だと思うけれども、
頭の中で色々練っている最中に、その助けとしてちょこちょこ手を動かすことはある。
メモというかスケッチというか、そんな感じのコード。
で、その一部が断片的に「本番」に流用されることならある。

258:デフォルトの名無しさん
10/02/20 14:52:22
すらすらとコードが書けないときは何かが間違ってるというのはあるねぇ

259:デフォルトの名無しさん
10/02/20 15:00:58
図に書く
スクリプトで書く
遅いところをC/C++に置き換える
寝る

260:デフォルトの名無しさん
10/02/20 15:08:48
まずコメントを先に書く
トイレに行く
コードを書きながら飯を食べる
コメントを直す

261:デフォルトの名無しさん
10/02/20 15:11:11
冷静に考えればいいだけだろうがばかどもが

262:デフォルトの名無しさん
10/02/20 15:13:31
やりたい事を考える
下っ端に薄給で作らせる

263:デフォルトの名無しさん
10/02/20 17:57:01
継続での脱出みたいなことってC++で出来ますか?
たとえばこんな関数があったときに、どこかでret=trueになったら
一番最初にfを呼び出した箇所へ飛んで関数を終わらせたい

bool f(){
bool ret=false;
//処理によってret=trueになったりならなかったり
for(int i=0;i<n;++i){ret|=f();}
return ret;
}
gotoで抜けられるのは今いる関数内のループだけだと思うので無理?

264:デフォルトの名無しさん
10/02/20 18:00:50
>>263
無理です。


265:デフォルトの名無しさん
10/02/20 18:07:53
>>263
たとえば、例外的なことがおきたときにプログラムの実行を中断したいというのであれば、
例外が使える。
だけど、例外は例外的な事以外に乱用すると非常に見通しの悪いプログラムになるから注意。


266:デフォルトの名無しさん
10/02/20 20:34:56
>>263
bool f(){
//処理によってret=trueになったりならなかったり
for(int i=0;i<n;++i){if(f())return true;}
return false;
}

267:デフォルトの名無しさん
10/02/20 23:19:09
makeって使ったことがないのですが、
勉強した方がいいのでしょうか。


268:デフォルトの名無しさん
10/02/20 23:24:24
いい

269:デフォルトの名無しさん
10/02/20 23:25:15
IDEに任せっきりでmakeってのから逃げまくっていたのですが、
やっぱり勉強します。

ありがとうございます。

270:デフォルトの名無しさん
10/02/21 00:14:10
tbbを実用で使い出したけど、メモリ関係の例外が出まくるぞ。
いつもではなくたまに。どうみてもエラーになり得ないところで例外。
そのためにtbb_allocがついているのか。
メモリ管理をtbb専用で全部置き換えれば直るんですか。

271:デフォルトの名無しさん
10/02/21 00:29:16
>270
>いつもではなくたまに。どうみてもエラーになり得ないところで例外。
使い方が間違ってて排他処理で失敗してるだけじゃないの?

272:デフォルトの名無しさん
10/02/21 00:49:38
そうか。試しに全書き換えでやってみる。

273:デフォルトの名無しさん
10/02/21 01:16:49
#define allocator scalable_allocator
とやると、
std::allocator がstd::scalable_allocatorになる。
std::allocator がtbb::scalable_allocatorにはどすればいい。
::がdefineにかけない。


274:デフォルトの名無しさん
10/02/21 01:19:09
#define std tbbにしたらエラーでまくり。当然全関数対応しているわけはなく。

275:デフォルトの名無しさん
10/02/21 01:33:30
namespace std {
 typedef xxx::myallocator myallocator;
}
#define allocator myallocator

276:デフォルトの名無しさん
10/02/21 01:47:52
できないです

template<typename T> class scalable_allocator;

となっていて、テンプレート引数が必要と出ます

277:デフォルトの名無しさん
10/02/21 01:53:11
単純なdefineの文字置き換えで出来ないかと考え中。
stdをstd0に書き換えて、tbbをstdにして、ここでヘッダを読み込み
std0をstdに戻せば、善さげなきはする。
別名で存在している関数をdefineで置き換えたらいけそう

278:デフォルトの名無しさん
10/02/21 02:06:20
駄目だった 再定義とか出る

279:デフォルトの名無しさん
10/02/21 02:08:02
バグの温床になりそうだな

280:デフォルトの名無しさん
10/02/21 02:25:01
悪夢だ・・・

281:デフォルトの名無しさん
10/02/21 02:26:17
アロケータの置き換えはTBBのチュートリアルにやり方が書いてある

282:デフォルトの名無しさん
10/02/21 02:44:48
面倒になってきたので標準装備のみで0から作るぜ

283:デフォルトの名無しさん
10/02/21 02:57:58
std::vector<int, tbb::scalable_allocator<int> >などとその都度指定する、
それをtypedefするというのは駄目なの?正統派だと思うのだけど。

C++0xなら
template<typename T>
using vector_tbb<T> = std::vector<tbb::scalable_allocator<T>>;
と書いて、vector_tbb<int>とかvector_tbb<std::string>とか書けるようになるんだけど、
まだ未来の話……。

284:デフォルトの名無しさん
10/02/21 06:26:39
if文で真偽値を評価すると真になる要素がいくつあるか数えるのを短く書きたいです。

vector<int> a;
// ;;;;;;;

int n = 0;
for(int i = 0; i < a.size(); ++i)
if( a[i] )
n++;

これを、
int n = std::count( a.begin(), a.end(), ?? );
ぐらいに短く書きたいのですが、なにかいい方法あります

285:デフォルトの名無しさん
10/02/21 06:30:24
ファンクタ使えば?

286:デフォルトの名無しさん
10/02/21 06:37:40
int n = a.size() - std::count(a.begin(),a.end(),0);

287:デフォルトの名無しさん
10/02/21 07:02:32
みなさまありがとうございます。


>>285
クラスを定義しようとすると、結局長くなってしまいますし、離れた場所に書くことになるため気に入りません。

>>286
それが良いですね。勉強になりました。

intの場合はそれでいいのですが、もうすこし一般化して、 if( a[i] >= 0 ) の場合などにも使える方法はありますか?

288:デフォルトの名無しさん
10/02/21 08:10:08
>>287
関数内クラス
boost::lambda
c+0x lambda関数


289:デフォルトの名無しさん
10/02/21 08:49:16
>>287
count_if(a.begin(), a.end(), bind2nd(not_equal_to<int>(), 0))
みたいなのをちょっとずつ変えれば

290:デフォルトの名無しさん
10/02/21 12:20:46
トークン結合演算子##を利用して
どうにかならんかね?

291:デフォルトの名無しさん
10/02/21 18:00:32
関数内にしかスコープのない関数って作れる?
void foo(){
std::cout << "foo\n";
}
の中で

void foo(){
void bar(){std::cout << "bar\n";}

bar();bar();bar();bar();
std::cout << "foo\n";
}

こんな風に。
普通に考えてC++では違反だと思うのだが、
どうにか回避するトリックとか。


292:デフォルトの名無しさん
10/02/21 18:03:15
>>291
ローカルクラスを使う。
URLリンク(www.fides.dti.ne.jp)

293:デフォルトの名無しさん
10/02/21 22:27:52
ローカルクラスは結構便利なんだけどなぜかあまり浸透してないよね

294:デフォルトの名無しさん
10/02/21 22:37:37
だってtemplateで外部にクラス渡せないし

295:デフォルトの名無しさん
10/02/21 23:05:50
名前空間やモジュールシステムを持たないJavaScriptのような言語ならともかく
C++ではあまり必要性がないと思う。ローカルクラスや関数内関数
クロージャはまた別だけど

296:デフォルトの名無しさん
10/02/21 23:08:02
ローカルクラスはtemplate引数も使えない。
あと0xでlambdaの型が外部に渡せるのに未だ渡せないローカルクラスは生きている意味があるのかと問いたい。

297:デフォルトの名無しさん
10/02/21 23:13:18
fainalなクラスとか?
ローカルクラスにできて他にできないことって特にないよなぁ
ローカルのほうが散らかさないで書ける場合はあるけど

298:デフォルトの名無しさん
10/02/21 23:17:58
「外部に渡せる」の意味がわからん

299:デフォルトの名無しさん
10/02/21 23:18:33
ローカルクラスは昔使ってたけど、関数が大きくなって読みにくくなるんで匿名名前空間に置くようになった。


300:デフォルトの名無しさん
10/02/21 23:27:08
ローカルクラスはデストラクタで自動でリソース解放するのにたまに使ったり。
(=スマートポインタのデリーターみたいな感じ。)

それとC++0xからはテンプレート引数に渡せるようになるね。

301:デフォルトの名無しさん
10/02/21 23:29:21
 × デリーター
 ○ カスタムデリーター
です。

302:デフォルトの名無しさん
10/02/21 23:35:29
無名の名前空間だとヘッダに書かないといけないテンプレートクラスに使えないね


303:291
10/02/22 00:16:05
>>292
ありがとうございます。


304:デフォルトの名無しさん
10/02/22 00:49:41
std::string str[] = {
"A",
"B"
};
これってバグの元になる?
int i = sizeof(str) / sizeof(str[0]);
こうするときとかに。

305:デフォルトの名無しさん
10/02/22 00:52:44
動的配列であってもその実体は内部にelementのpointerを持っているだけなので
中身のデータが違ってもインスタンスの大きさはそれぞれ同じ。

306:デフォルトの名無しさん
10/02/22 00:54:13
>>305
即レスかつわかりやすい説明ありがとうございます。
不安がなくなりました。

307:デフォルトの名無しさん
10/02/22 00:58:51
C99で絶望するがよい。

308:デフォルトの名無しさん
10/02/22 01:01:14
素直にvector<string>使いなよ。

309:デフォルトの名無しさん
10/02/22 01:03:48
>>304-306
何を心配してたのかわかんない。少し解説してもらえるとうれしい。

310:デフォルトの名無しさん
10/02/22 01:08:08
std::string a = "asdf", b = "9999999999999999999999999999999";
って文字列の長さが違うからsizeof(a)とsizeof(b)で同じ数値になるの!?
std::stringで配列作っていいの!?!?!??!?!!!???わかんないです><;;;;;

→ のーぷろぶれむ


311:304
10/02/22 01:15:14
>>310
ありがとう。
その通りでした。

>>308
あとあと編集しづらいかな見にくいかなと思ったので。

312:デフォルトの名無しさん
10/02/22 01:47:53
クラス内にstatic constのint値を定義して,
#defineの代わりにしたいんですが,
このint値はそのクラスのインスタンスを生成してなくても,
メモリ上に存在するのでしょうか?
そうなると,大規模開発では避けるべきなのでしょうか?

313:デフォルトの名無しさん
10/02/22 01:51:08
#defineされた値だとプログラム全体の最適化がされない限り書く度に別々のところに数値が配置されるけどね。

314:デフォルトの名無しさん
10/02/22 02:00:33
グローバル変数ってlibファイルで共有?
モジュールで共有?


315:デフォルトの名無しさん
10/02/22 17:47:17
>>312
最適化すりゃどうせ消える

316:デフォルトの名無しさん
10/02/22 21:00:22
>>312
まあ理屈はそうだけども、
現実的にはその最適化がなされないような状況は
明示的にコンパイルオプションで止めろ!
と言わない限りおこんなinじゃない?


317:デフォルトの名無しさん
10/02/22 21:40:04
staticなんだからインスタンスは関係ないんじゃ

318:デフォルトの名無しさん
10/02/22 21:56:37
templateクラスのstatic変数ならあるいは

319:デフォルトの名無しさん
10/02/22 22:40:59
hiphopのwindows binaryありますか。phpコードをc++に書き換え、phpから利用できるようになるようなんですが。
ソースコード。
URLリンク(github.com)

320:デフォルトの名無しさん
10/02/23 01:04:04
来月出版の
C++テンプレートメタプログラミング
糞本かな?

えぴなんとかさんの書いた類の糞本レベル?

321:デフォルトの名無しさん
10/02/23 05:41:33
禿本の邦訳にも係わってる人だよ

322:デフォルトの名無しさん
10/02/23 12:14:03
えぴなんとかさんってすごいのかどうかよくわからん
昔の掲示板ログとか見るととんちんかんな感じだよね
えぴなんとかさんが初心者だったころなのかもしれないけど

323:デフォルトの名無しさん
10/02/23 18:19:02
これのことかな
URLリンク(episteme.wankuma.com)


324:デフォルトの名無しさん
10/02/23 18:48:30
わんくま同盟ってなんか気持ち悪いよね
公開しているドキュメントでお世話になってはいるけど、近づきたくない感じ

325:デフォルトの名無しさん
10/02/23 19:14:15
気持ち悪いというあいまいで感覚的な概念が気持ち悪い



326:デフォルトの名無しさん
10/02/23 19:41:10
単に偉そうでむかつくんだろ

327:デフォルトの名無しさん
10/02/23 19:47:58
「気持ち悪い」のはともかく、「よね」が意味わからん

328:デフォルトの名無しさん
10/02/23 20:52:33
内輪ネタを表に出したがるあたりと偉そうなのはむかつくが同意は求めない

329:デフォルトの名無しさん
10/02/24 00:19:05
えぴなんとかさんって
インなんとかさんみたいなもんか?

330:デフォルトの名無しさん
10/02/24 00:42:06
ペンネームに機種依存文字を使うプログラマの人って…

331:デフォルトの名無しさん
10/02/24 00:50:37
ビル☆ゲイツの悪口はそこまでだ

332:デフォルトの名無しさん
10/02/24 01:07:23
C++学ぶのにいい本ありませんか?


333:デフォルトの名無しさん
10/02/24 01:08:02
>>332 >>4-5

334:デフォルトの名無しさん
10/02/24 01:11:44
>>330
今チェックしたんだけど
機種依存文字じゃなかったぞ

335:デフォルトの名無しさん
10/02/24 06:51:15
>>332
こいつはマルチポストだから相手にしないように!


336:デフォルトの名無しさん
10/02/24 18:30:19
単項演算子-のオーバーロードについて質問があります。
独習C++という本で勉強しているのですが、以下のようなサンプルコードがあります。(※一部省略)
class coord{
int x,y;
public:
coord(){x=0;y=0;}

coord operator-(coord ob2);//2項負符号
coord operator-();//単項負符号
};
//単項-をcoordクラスに対してオーバーロードする
coord coord::operator-(){
x=-x;
y=-y;
return *this;
}
上記の場合、
coord ob1;
coord ob2;
ob2=-ob1;
としただけで、ob1の内容が変わってしまうと思うのですが、
このサンプルコードは正しいのでしょうか?
以下のほうがいいと思うのですが。
//単項-をcoordクラスに対してオーバーロードする
coord coord::operator-()
{
coord temp;
temp.x=-x;
temp.y=-y;
return temp;
}

337:デフォルトの名無しさん
10/02/24 18:33:57
俺もそのほうが良いと思う
一般に組み込み型と同じ挙動になるようにデザインするほうが良いと
EffectiveC++にも書いてあるし

338:デフォルトの名無しさん
10/02/24 18:40:12
そしてconstを付けるべき

339:デフォルトの名無しさん
10/02/24 19:21:48
>>336
君の意見は正しい。
coord coord::operator-()const;
とすれば納得できると思う。

340:336
10/02/24 19:57:51
>337-339
ありがとうございました。
これで先に進めます。

341:デフォルトの名無しさん
10/02/24 23:20:04

*thisを返すからいいんじゃないの?

342:デフォルトの名無しさん
10/02/24 23:23:33
this->xが変わるからダメなんじゃないの

343:デフォルトの名無しさん
10/02/24 23:28:54
プログラムに致命的なエラーがあり
(取り扱えない例外をキャッチしたなど。)
そこで即座に終了したい場合、
assert(0);
exit(1);
のどちらが望ましいのでしょうか?

また、この2つにはどんな違いがあるのでしょうか?

よろしくお願い申し上げます。

344:デフォルトの名無しさん
10/02/24 23:33:31
>>342
ああ、すまない。ぼけてたorz
もう寝る…

345:デフォルトの名無しさん
10/02/24 23:42:17
>>343
assertは、ここでこうなってるはずがない、というプログラマの意思表示
んで、それはリリースビルドだとなくなるロジック

346:デフォルトの名無しさん
10/02/24 23:59:19
インターフェースと実装を分離したいと思ってて、pImplイディオムを利用しようと考えています。
一般的なpImplイディオムは、コンストラクタでimpクラスをnewしていますが、
いま設計しているpImplを利用したクラスは、何度もインスタンス化されるので、newしたくありません。
また、Factory関数を作って、利用者側にわざわざ呼ばせたくありません。

つまり、クラスの利用者から、実装クラスを隠蔽し、かつインスタンス化時に何度もnewしないような方法はありますでしょうか?
(妥協して、メンバ変数だけインターフェース部に持ってきて、実装クラスをSingletonにする、など考えてみましたが、案の定イマイチでした)


347:デフォルトの名無しさん
10/02/25 00:22:00
一つ一つ中身が違うならプールして再利用ぐらいしか思い付かないなぁ


348:デフォルトの名無しさん
10/02/25 01:11:41
>>343
その用途だと abort() あるいは terminate() が正解だと思う。
assert() と exit() 含めて、それぞれの違いはライブラリのドキュメント読んでね。

349:デフォルトの名無しさん
10/02/25 01:14:23
>>346
new したくないっていうのは動的メモリ確保のコストを嫌っての話だよね?
そういうことなら、外側のクラスに char impl_storage[max_size] みたいな領域だけ
置いといて、実装クラスでは new (impl_storage) impl(....) すればいいかもしれない。

350:デフォルトの名無しさん
10/02/25 01:16:15
>>346
dlmallocなんて単純だからすぐ作れるし
自分でmalloc作ればいいよ

351:デフォルトの名無しさん
10/02/25 01:20:56
>>346
まず、ふつうに new する状態でパフォーマンスに問題があって、次にそのボトルネックが
new にあるという確認を済ませ、さらに >350 の言うように dlmalloc などによる高速化を試みた後、
それでも問題が残るようなら >349 のような奇怪なコードを、十分なコメントを添えたうえであれば、
書いても良い。

それ以外は許さん。

352:デフォルトの名無しさん
10/02/25 01:51:00
>346
実装インスタンスのnewコストを気にするんだったら、不要になったら再利用できるように簡単なGC作ったら?
実装インスタンス自体は利用者から見えないから、別にFactory関数で管理しても問題ないだろうし。
お手軽に実装するんだったらboost::shared_ptr + deleterかね。


353:デフォルトの名無しさん
10/02/25 02:01:58
>>343
assertは開発作業中のマーキングや「しおり」のようなものだと考えたほうがいいと思う。
exitはatexitの登録関数やストリームI/Oの後始末をしてから終了する。
C用の例外の代替物と見るべきで、C++では使わないだろう。デストラクタは実行されないし。
terminate(abort)なら後始末もせずに割り込みを掛けて即座に終了するが、
そこまでしたい状況は考えにくい。
結局、例外をそのまま放っておいてmainでキャッチしてreturn 1;とかするのが
常道だと思う。

354:デフォルトの名無しさん
10/02/25 02:05:19
>>343
取り扱えない例外ははじめからキャッチするなよ。
万一そんな状況がやむを得ないとすれば、 throw; で外に向けて投げとけばいいよ。
そうすれば勝手に terminate() するかもしれないし、誰かがキャッチしてくれるかもしれない。

355:デフォルトの名無しさん
10/02/25 03:30:24
enum型を引数に持つときって参照渡しにした方がいいの?
構造体とは違うっぽいのでしなくてもいい?速度的に

356:デフォルトの名無しさん
10/02/25 03:38:12
>>355
速度が気になるなら計測してみるがいい。

参照渡しがよくあるポインタと同様の実装だと考えると、 enum のサイズがポインタより
大きくなることはなさそうで、あまりメリットはなさそうな感じではある。

357:デフォルトの名無しさん
10/02/25 03:54:59
>>351
配置newって嫌われ者なの?

358:デフォルトの名無しさん
10/02/25 05:48:41
>>355
列挙型の実態が整数"ではない”実装を見たことがない。

359:デフォルトの名無しさん
10/02/25 09:35:37
>>357
別に配置newは嫌いじゃないですが、必要ないところで使うような人は嫌いです。

360:デフォルトの名無しさん
10/02/25 10:53:34
誰もつっこまないけどchar impl_storage[max_size]なんてしたらアライメントどうするんだよ。

361:デフォルトの名無しさん
10/02/25 10:55:15
>>360 boost::aligned_storage あたりでおきかえる。

362:デフォルトの名無しさん
10/02/25 11:33:04
じゃあ最初からboost::aligned_storageって書けよ

363:349
10/02/25 12:07:15
>>362
boost::aligned_storage は標準ライブラリでもないし、コンパイラの拡張機能で指定した
ほうがいいかもしれないし、その場で適当な union 作ってしのぐのがいいかもしれないし、
そんな気持ちを込めて「~みたいな領域」と書きました。

364:343
10/02/25 12:49:32
>>345>>348>>353-354
ありがとうございます。
assert() exit() terminate() abort()
について勉強してきます。



365:デフォルトの名無しさん
10/02/25 17:02:41
>>363
>そんな気持ちを込めて「~みたいな領域」と書きました。
どう考えてもそれだけの情報からその気持ちは伝わらないから。
頭大丈夫?日本語分かる?精神鑑定してもらったら?

366:デフォルトの名無しさん
10/02/25 20:49:40
解析で使う

  A-Z  a-z  0-9
1  1   2   3
2  1   2 3
3
4

な表ってなんて名前だっけ?

367:デフォルトの名無しさん
10/02/25 20:57:50
>>366
LR解析表なのか?状態複数あって
LR衝突してないのか?

368:デフォルトの名無しさん
10/02/25 21:03:59
>>367
表の中は説明で適当に書いただで意味はないんだ。
どんな名前だったか忘れてしまったもんで。
助かったよ。ありがとう


369:デフォルトの名無しさん
10/02/25 22:34:38
>>365
俺には伝わっていたが、伝わらない人がいるのもわかる。
そして、伝わらなかったからといってそのようなレスをするあなたが心配です。

370:デフォルトの名無しさん
10/02/26 13:26:29
一般に、
g++ -lhoge test.cpp
という調子でライブラリを読み込んで成功したとき、
hogeの場所を知るコマンドってありますか?

具体的には
g++ -llapack test.cpp
なのですが、これは
Fortranのライブラリをリンクしているそうです。

Fortranでは
DSYEV
という関数名なのがC系だと
dsyev_
と、アンダーバーがつくようになるというのがよく分からないので・・・。


371:デフォルトの名無しさん
10/02/26 14:38:16
よくわからんが、場所っていうのはディレクトリ名じゃなくて関数名のことかい
それにOS依存の話題だったら微妙にスレ違いだぜ

372:デフォルトの名無しさん
10/02/26 15:45:41
LD_LIBRARY_PATHとか

373:デフォルトの名無しさん
10/02/26 15:47:09
・リンカが検索に用いるパスを探すことで場所を知ることができる
・ラッピングした際に小文字にしたんでしょう

374:デフォルトの名無しさん
10/02/26 16:06:37
>>370
URLリンク(www.netlib.org)
As previously stated, the CLAPACK library was built using
a Fortran to C conversion utility called f2c. The entire
Fortran 77 LAPACK library is run through f2c to obtain C
code, and then modified to improve readability. CLAPACK's
goal is to provide LAPACK for someone who does not have
access to a Fortran compiler.

It is important to note that this f2c conversion was run on
a machine that appends an underscore to differentiate C
and Fortran 77 namespaces. If your machine does not append
an underscore to differentiate namespaces, then CLAPACK
will not work on your machine.


375:デフォルトの名無しさん
10/02/26 17:11:46
ありがとうございます。
だんだん事情が分かってきました。
人間がCに移植しているわけではないのですね。
clapack.h
をみても、単に宣言が書いてあるだけなので、
Cのソースコードとしてincludeするわけでもないのか。

あと前半はたしかにOS依存の話ですね。
手元の環境ではLD_LIBRARY_PATHも空だったし。
すみませんでした。

376:デフォルトの名無しさん
10/02/26 20:04:26
/*******************************************************/
 #define MAX(x,y) ((x)>(y) ? (x):(y))
 int a = 3;
 int b = 3;
 int m = MAX(a,++b);
はプリプロセッサによって
 int a = 3;
 int b = 3;
 int m = ((a)>(++b) ? (a):(++b));
と展開されます。
結果的に++bが2度評価され、bとmは5になってしまいます。
/*******************************************************/
という記述を見たのですが、標準C++の規格ではbとmは5になるってのは保証されますか?
私には未定義の動作になりそうに見えるのですが。

よろしくお願いします。



377:デフォルトの名無しさん
10/02/26 20:07:07
保証されますよ

378:デフォルトの名無しさん
10/02/26 20:25:05
>>377
 int m =++b, a , ++b;
の場合はどうなりますか?
bとmが5になりますか?
それとも未定義の動作でしょうか?

379:デフォルトの名無しさん
10/02/26 20:30:14
未定義の動作ですよ

380:デフォルトの名無しさん
10/02/26 20:39:49
 int m = (a)>(++b) ? (a):(++b);
だとOKで、
 int m =++b, a , ++b;
だと未定義の動作なのですね。

うーん、ややこしいです。
両方とも一つの式の中で2回bの値が
変化しているように思うのですが、
どういった相違により
片方がOKでもう一方はダメに
なるのでしょうか?


381:デフォルトの名無しさん
10/02/26 20:41:58
カンマがね、ヤバイんですよ・・・ここだけの話

382:デフォルトの名無しさん
10/02/26 20:54:23
unsigned A(){
struct{unsigned a;unsigned operator()(int x){return ++a<<x;}}r={1};
retrun r(0)|r(8)|r(16)|r(24);}

0x04030201 // 式中でオブジェクトの順状態て保証される?

383:デフォルトの名無しさん
10/02/26 21:00:47
>>382
されない

384:デフォルトの名無しさん
10/02/26 21:42:11
なんか関数の実引数の区切りのカンマと、カンマ演算子を間違っているやつがいるようだ。
>>378 の m, b ともに 5 になることは保証されているぞ (5.18-1)
m=func(++b, a, ++b); だと未定義動作だけどな。

>>376 副作用完了点でぐぐってみるべし

385:デフォルトの名無しさん
10/02/26 22:03:09
a++, a++;

未定義

386:380
10/02/26 22:23:55
int m=func(++x, ++x); が未定義動作というのは全会一致ってことですね。

 int m = (a)>(++b) ? (a):(++b); は正当で
 int m =++b, a , ++b; も正当
ですが
 int m =++b, ++b;
は未定義ということなのですか?

int m=(++x) + (++x); は未定義動作になりますか?



387:デフォルトの名無しさん
10/02/26 22:39:06
未定義

388:デフォルトの名無しさん
10/02/26 22:39:58
>>384
int a=3;
int b=3;
int m =++b, a , ++b;

このときにmが5になることが保証されているといっている?

389:デフォルトの名無しさん
10/02/26 22:40:35
>>378 これはコンパイルエラーでしょ。

390:デフォルトの名無しさん
10/02/26 22:43:36
>>384
カンマ演算子は副作用完了点たりえないのでは?

391:390
10/02/26 22:45:15
間違えて覚えてたみたい。ごめんなさい。

392:384
10/02/26 22:46:49
章番号までちゃんと示してある。言語規格書呼んでから話するんだな。

393:デフォルトの名無しさん
10/02/26 22:54:23
>>392
自信満々のところ水を差すようだけど、 >389 の言うとおりコンパイルエラーになると思うんだ。

カンマ演算子とか言ってるところを見ると、
 int m =(++b, a , ++b);
こう解釈したんだろうとは思うけど。

394:デフォルトの名無しさん
10/02/26 22:54:31
特例は3項演算子、カンマ演算子のほかに&&と||もあるから
int b=1;
int a=++b&&++b&&b;
こんなのでもちゃんとa=3になるな
しかしひどいコードだ

395:デフォルトの名無しさん
10/02/26 22:57:41
もういいから黙って二行に分けろよカス

396:デフォルトの名無しさん
10/02/26 22:59:04
>>393
その程度だろ
URLリンク(codepad.org)
今話してる話題と関係ないだろ

397:デフォルトの名無しさん
10/02/26 23:07:28
何そのイン○リさんみたいな返し?流行ってんの?

398:デフォルトの名無しさん
10/02/26 23:08:14
何言ってんだか

399:デフォルトの名無しさん
10/02/26 23:11:21
>>393
コンパイルエラーにはならず、カンマ演算子の最後、つまり2回目の++bが値として使われるので
mに4が代入された後、bはインクリメントされる。
なので、>>388を書いた。

400:デフォルトの名無しさん
10/02/26 23:16:56
>>399
なんだか知らんが
++bは前置増分演算子って呼ぶってことは知ってるの?

401:デフォルトの名無しさん
10/02/26 23:20:01
URLリンク(codepad.org)
ああこういう意味でコンパイルエラーってことね。

上記の話をまとめると
 int m =(++b, a , ++b);

 URLリンク(codepad.org)
のようになり、正当な動作をするって考えていいのね。



402:デフォルトの名無しさん
10/02/26 23:21:46
つまり
3項演算子(条件演算子
カンマ演算子
&&
||
の4つは、副作用完了点となるから
それらのオペランドに++aが複数回出現しても
未定義の動作にならないってこと?


403:デフォルトの名無しさん
10/02/26 23:29:57
>>400
なんだかどうしようもないところでボケていてすまんかった

404:デフォルトの名無しさん
10/02/26 23:45:55
>>402
「オーバーロードされてなければ」それで合ってる

405:デフォルトの名無しさん
10/02/27 15:54:25
URLリンク(codepad.org)
このコードで
std::cout << hairetsunoyousosuu(arr) << std::endl;
の部分は 期待通りになるのですが
std::cout << foo(arr) << std::endl;
の部分が期待通りになりません。

どうすれば
「引数として渡された配列の要素数を返す『関数』」
が書けるでしょうか?

よろしくお願い申し上げます。


406:デフォルトの名無しさん
10/02/27 16:00:57
関数の仮引数の[]はただのポインタに変わる
コンパイル時にわかるものなら_countofを参考にする
それをDLLとして公開するとか誰が渡すんだかわからないものを自動で取得する汎用的な方法はない

407:デフォルトの名無しさん
10/02/27 16:03:23
>>405
main::arrはint[5]型
foo::argはint[]型
sizeof(int[5])はsizeof(int*) * 5
sizeof(int[])はsizeof(int*)
int*とintの大きさがたまたま同じだっただけ。

408:デフォルトの名無しさん
10/02/27 16:05:30
>>406
ポインタとは違ってmainで定義したarrの要素全部がコピーされるけどね。

409:デフォルトの名無しさん
10/02/27 16:34:50
構造体と勘違いしてんじゃねえのお前

410:デフォルトの名無しさん
10/02/27 16:42:25
こまけぇことはいいんだ、vector使え!

411:デフォルトの名無しさん
10/02/27 18:23:11
>>405
なんか codepad は Error 500 で見れなかったんだけども、こういう話?
URLリンク(d.hatena.ne.jp)

412:405
10/02/27 19:19:17
>>406-411
みなさんありがとうございます。

template<class T, int N> int len(T (&)[N]){return N;}

#include <cstddef>
template<typename T, std::size_t N>
char (&lengthof_helper_char_array(T (&a)[N]))[N];
#define lengthof(a) (sizeof(lengthof_helper_char_array(a)))
ですと、どちらが望ましいのでしょうか?


413:デフォルトの名無しさん
10/02/27 19:24:04
>>412
どちらが望ましいかは場合によるね。
前者はコンパイル時定数としては使えない。
後者はコンパイル時定数として使えるようにしてあるけど、そのために読みにくく
なっているし、基本的に避けるべきであるマクロまで組み合わされている。

414:デフォルトの名無しさん
10/02/27 19:39:51
>>413
なるほど、そう言った違いがあるのですね。

ありがとうございました。

415:デフォルトの名無しさん
10/02/27 19:43:00
URLリンク(www.kijineko.co.jp)
ここに書いてあることについてお伺いしたいのですが。


const char str[] = "abc123";
for (char* s = str; *s != '\0'; s++)
{
 if (isalpha(static_cast<unsigned char>(s)))
 {
  ...
 }
}
こうすべきとのことですが、これは
const char str[] = "abc123";
for (char* s = str; *s != '\0'; s++)
{
 if (isalpha(s))
 {
  ...
 }
}
の用にキャストを外すと動かないことがあるということでしょうか?
"abc123"のように、内容全てがASCII文字であってもだめなのでしょうか?

よろしくお願い申し上げます。



416:デフォルトの名無しさん
10/02/27 19:46:07
>通常は問題ないのですが、多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合などは、

417:デフォルトの名無しさん
10/02/27 20:04:49
>>416
多バイト文字を含む文字列の各要素も
isalphaでアルファベットかどうかを調べることが可能と言うことでしょうか?

たとえば
"あいうえおabcd"
のような全角文字でもできるのでしょうか?

418:デフォルトの名無しさん
10/02/27 20:10:47
その記事も含めてそんなことをいってる奴は居ない

419:デフォルトの名無しさん
10/02/27 20:11:28
> is 系関数に実引数として渡すことができる値は、0 ~ UCHAR_MAX または EOF だけです

420:デフォルトの名無しさん
10/02/27 20:30:00
ASCIIだけなら問題ないんじゃない?
他の文字コード入ってたら知らんけど

421:デフォルトの名無しさん
10/02/27 20:58:27
"abc123"は多バイト文字を含む文字列ではありませんよね。
では多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合など
とは、具体的にはどんな文字列のことなのでしょうか?



422:デフォルトの名無しさん
10/02/27 21:17:37
sjisとかunicodeとか。
isalphaのかわりに_ismbcalphaやiswalphaで調べられる。

423:デフォルトの名無しさん
10/02/27 21:22:38
3の倍数のときだけ多バイトな文字列の例.
"123456789"


424:デフォルトの名無しさん
10/02/27 21:39:22
それスゲー迷惑だけどオッサンが漢字キーを駆使しながら頑張って作ったものだと想像するに少し許せる
正規表現置換とかだったら死刑

425:デフォルトの名無しさん
10/02/27 23:14:54
文字コードって訳わかんない
ひとつに絞って他のコードは国際法で規制しろよ

426:デフォルトの名無しさん
10/02/27 23:43:28
>>425
トロンコード最強ってことで。くっくっく。

427:デフォルトの名無しさん
10/02/28 00:29:23
>>415
isalpha()に「0~UCHAR_MAX または EOF 以外の値」が渡された時の動作は未定義
ということはわかっているのかね。きじねこは不可解な動作やらクラッシュという表現をしてるが

例えばstrにSJIS全角文字「A」(コード0x8260)を含んでいたとして(str="Aabc123"とか)
forループ内でisaplha()に、0x82、0x60と渡されていくことになるが、
例えばcharが符号付きでint型が32ビットの処理系だと0x82→0xffffff82と
符号拡張で変換されるから「0~UCHAR_MAX または EOF 以外の値」となって未定義となる
unsigned charにキャストしとけば「0~UCHAR_MAX または EOF」には納まる

このきじねこの記事雑だな
constや*忘れてる

428:415
10/02/28 00:34:56
>>422
>>423
>>427
解説ありがとうございます。
そう言った意味なんですね。


429:デフォルトの名無しさん
10/02/28 18:15:24
hoge *p = new hoge;

my::smp q(new hoge); // ok
my::smp r(p); // no!

上の初期化法だけを許可したいんだけど、方法はある?
つまりテンポラリなポインタだけを受け取れるような方法
C++0xだと右辺値参照というのがあるからできるらしいのだけど・・・
今ではまだメタプログラミングを駆使しても不可能かな?

430:デフォルトの名無しさん
10/02/28 18:20:41
無理。my::smpのコンストラクタ内でnew hogeを実行するようにすれば近いことはできるんじゃない?
引数付きのコンストラクタも考えると現実的でないが

431:デフォルトの名無しさん
10/02/28 19:01:30
>>430
thx
コピーコストが気になるけどその方向で考えてみますわ

432:デフォルトの名無しさん
10/02/28 21:10:12
boostにそんなのがあった気が

433:デフォルトの名無しさん
10/02/28 23:34:24
テンプレートクラスについてお聞きします。
テンプレートクラスは、ヘッダファイル内に関数の実装の定義も書きますよね?
もしテンプレートの特殊化をした場合は、cppファイルに書いていいものなのでしょうか?

たとえば、テンプレートパラメータにbool値をとるクラスを定義したとして、
関数の実装をヘッダファイルに書かず、
テンプレートパラメータがtrueのときの処理と、falseのときの処理を
それぞれcppファイル側に書いてもいいものでしょうか?
(そのようなクラス設計がいいかどうかは別として・・・)

434:デフォルトの名無しさん
10/02/28 23:36:04
>>433
まずいだろう
他のファイルからもそのヘッダファイルを参照していたらどうなる?

435:デフォルトの名無しさん
10/02/28 23:50:58
>>433
いいよ

template<bool A>
struct X
{
void f() {}
};

template<>
struct X<true>
{
void f();
};

とヘッダーに書いて

void X<true>::f(){}

を別のコンパイル単位に書くのはOK。
bool が typename でも同じ


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch