C++相談室 part77

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part76
http://pc12.2ch.net/test/read.cgi/tech/1260972593/
2デフォルトの名無しさん:2010/01/15(金) 21:02:55
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 http://www.cppreference.com/ (英語)
 http://www.cppll.jp/cppreference/ (↑の日本語訳だけど最新は反映していない)
[禿 Stroustrup]
 http://public.research.att.com/~bs/
[C++ International Standard]
 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 http://www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 http://www.jisc.go.jp/app/pager?#jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
3デフォルトの名無しさん:2010/01/15(金) 21:03:06
4デフォルトの名無しさん:2010/01/15(金) 21:03:16
5デフォルトの名無しさん:2010/01/15(金) 21:03:28
6デフォルトの名無しさん:2010/01/15(金) 21:03:38
 codepad
 ttp://codepad.org/

長いソースを貼るときはここへ!
7デフォルトの名無しさん:2010/01/15(金) 21:03:50
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
8デフォルトの名無しさん:2010/01/15(金) 21:04:04
ぬるぽ
9デフォルトの名無しさん:2010/01/16(土) 00:13:02
template <class F>
class widget;

template <class R, class A>
class widget<R(A)>
{
};

int main(void)
{
widget<void(int)> w1;
widget<int(void)> w2; // err

return 0;
}

w1は大丈夫なのに、w2でコンパイルエラーがでる
原因がさっぱりわからない・・・
10デフォルトの名無しさん:2010/01/16(土) 00:38:12
>>9
template <class F>
class widget;

template <class R, class A>
class widget<R(A)>
{
};

template <class R>
class widget<R()>
{
};

int main(void)
{
widget<void(int)> w1;
widget<int()> w2; // err

return 0;
}
1110:2010/01/16(土) 00:46:27
>>10
boost::function(int())でいつも使ってたからint(void)はできないのかも?っと思ってたんだけど、
念のためにboost::functionで試してみたら、boost::function<int(void)>はあっさり通るのね。boost::functionのソース見れば分るかも。


12デフォルトの名無しさん:2010/01/16(土) 01:12:01
>>9
> template <class R, class A>
> class widget<R(A)>
これは引数をひとつ取る関数に対する特殊化。
引数を取らない関数について適用されないのは当然と言えば当然。


引数を取らないことを表す引数リスト (void) は括弧も含めた特殊な
構文であって、型が void の引数をひとつ指定すれば有効というわけじゃない。
つまりこんなの↓も実は不正。

typedef void A;
int f(A);
13デフォルトの名無しさん:2010/01/16(土) 13:23:16
>>12
超分かりやすい
14デフォルトの名無しさん:2010/01/16(土) 15:37:26
>>12
ありがとう
15デフォルトの名無しさん:2010/01/16(土) 17:38:28
Lokiライブラリって、具体的にどのような環境で動くか
示されていますか?
Boostよりはやっぱ動きにくいんですか?
16デフォルトの名無しさん:2010/01/16(土) 19:52:38

template < class Type >
class BaseVec2
{
public:
Type x;
Type y;
//メソッドは省略
}

typedef BaseVec2<double> Vec2f;
typedef BaseVec2<int> Vec2i;

int main()
17デフォルトの名無しさん:2010/01/16(土) 20:00:33
吸いません間違えて途中で送ってしまいました

template < class Type >
class BaseVec2
{
public:
Type x;
Type y;
//メソッドは省略
}

typedef BaseVec2<double> Vec2f;
typedef BaseVec2<int> Vec2i;

void Func( Vec2f& arg_vec )
{
//省略
}
int main()
{
Vec2f vecf;
Vec2i veci;

vecf = veci;//ここと
Func( veci);//ここが問題
}


vecf = veci;
Func( veci );
この2行がうまくいくような( メンバ変数x,yが勝手に代入される )やり方ってありませんか?
18デフォルトの名無しさん:2010/01/16(土) 20:21:25
コピーコンストラクタとコピー代入演算子をテンプレートで書く。
例えばこんなの。

template<class U>
BaseVec2(const BaseVec2<U>& src) : x(src.x), y(src.y) {}

template<class U>
BaseVec2& operator=(const BaseVec2<U>& rhs) { x = rhs.x; y = rhs.y; return *this; }
19デフォルトの名無しさん:2010/01/16(土) 20:43:49
>>18
解決しました
ありがとうございます
20デフォルトの名無しさん:2010/01/16(土) 22:43:24
>>19
一応注意しておくが、テンプレートコンストラクタやテンプレート代入演算子は
(最終的なシグネチャが同一でも)コピーコンストラクタやコピー代入演算子ではないので、
それらを定義しないと依然としてコンパイラが自動生成する。
単にメンバ全部コピー以外の処理を行いたい場合は気をつける必要がある。
struct A {
B b;
template<typename T> A(const T &t);
template<typename T> A &operator=(const T &t);
// 定義しないと自動生成
// A(const A &a): b(a.b) {}
// A &operator=(const A &a) { b = a.b; return *this; }
};
21デフォルトの名無しさん:2010/01/16(土) 23:13:35
35へぇー
22デフォルトの名無しさん:2010/01/16(土) 23:17:52
>>20
これはEffective C++にも書いてあったと思うが。
23デフォルトの名無しさん:2010/01/17(日) 00:58:48
C++を使うなら必読本ではあるが
読んで無い奴もいるだろうよ
24デフォルトの名無しさん:2010/01/17(日) 12:47:50
昔図書室から借りて一回読んだだけなので忘れてた俺ガイル
25デフォルトの名無しさん:2010/01/17(日) 13:28:35
Effective C++って良いって聞く割にたいして内容なくて読んでがっかりした。
これ読むくらいならExceptional C++でも読むほうがましかなー
26デフォルトの名無しさん:2010/01/17(日) 14:58:31
>>25
そんな実力上がってから『Effective C++』を批判するのは卑怯では?
その理屈だとさらに実力を上げてから『Exceptional C++』を読んでも
そんなん知ってるよって言うことになるのでは?
27デフォルトの名無しさん:2010/01/17(日) 15:43:08
クラスを作る時に、全てのメンバ変数に対するGetXXX,SetXXXみたいな関数を
自動的に定義してくれるテンプレートみたいのなかったっけ
思い出せなくて、ぐぐってもうまくぐぐれなくて見つからない
28デフォルトの名無しさん:2010/01/17(日) 15:45:07
>>27
そんなウンコな機能要らない。
貴様はクラスの実装からインターフェースを書き起こすのか?逆だろ?
29デフォルトの名無しさん:2010/01/17(日) 15:45:32
weak_ptrってどうやって実装してるんだろう
30デフォルトの名無しさん:2010/01/17(日) 15:46:39
>>29 boost の実装見れ
31デフォルトの名無しさん:2010/01/17(日) 15:47:34
でも、答えを見たらなんか負けた気になりませんか?
32デフォルトの名無しさん:2010/01/17(日) 15:48:24
>>31
じゃあ答えは見ずに、聞けば(>>29)いいのか?w
33デフォルトの名無しさん:2010/01/17(日) 15:48:40
>>31
デザパタってのがあるだろ。
それと同じで、良い実装を読むことは負けじゃない。
34デフォルトの名無しさん:2010/01/17(日) 16:07:52
>>29
ぶっちゃけるとweak_ptr用とshared_ptr用に二つ参照カウンタ持ってるだけ。
35デフォルトの名無しさん:2010/01/17(日) 16:11:18
>>34
ぶっちゃけたwww
36デフォルトの名無しさん:2010/01/17(日) 16:49:57
class Y : public X { 〜 };
void func(X &x) { 〜 };

X x;
Y y;

X &r = x;
func(r);

X &s = y;
func(s);

↑のfunc(s)をエラーにしたい(派生クラスを受け付けたくない)んですけどそういうことは可能でしょうか?
37デフォルトの名無しさん:2010/01/17(日) 16:59:38
>>36
Y を直接渡したときならまだしも、 X に変換した後ではコンパイラには区別が付かない。
仮想関数がついてれば typeid で調べることはできる。

そもそもそんなことがしたくなること自体、何か継承というものについて誤解があるんじゃ
ないかと思う。
38デフォルトの名無しさん:2010/01/17(日) 17:11:03
やっぱ変ですかね?

template <class T> class obj_pool
{
public:
T *Alloc();
void Dealloc(T *p);
private:
list<T *> objs;
};

こんな感じでオブジェクトを使いまわそうかと思ったんですが
どの派生型でもDeallocで格納できてしまうので
取り出すときに区別がつかなくなってしまいます
39デフォルトの名無しさん:2010/01/17(日) 17:12:11
>>36
「基底クラスに対してできる操作は全て派生クラスに対してもできなければならない」
これが public継承の基本 です。
あなたのケースで言えば
「Xに対して適用できる関数func()はYに対してもできなければならない」
ということになります。
逆にこの public継承の基本 が満たされない場合、それは
YはXの特別な場合ではないということになり、
public継承が不適切な場合ということになります。
40デフォルトの名無しさん:2010/01/17(日) 17:14:45
>>38
最初に Alloc() で作った奴しか Dealloc() できない、とかそういうルールで使えば
いいんじゃないの?
RAII スタイルのラッパーを用意するとか。
41デフォルトの名無しさん:2010/01/17(日) 18:45:45
クラステンプレートを使ってのプログラミングをしています。

template<class T> void func(T obj) { obj(10, 20); };
void test(int a, int b) { printf("%d + %d = %d\n", a, b, a + b); }

において、

func<void(int, int)>(test);
func<void(*)(int, int)>(test);

では何がちがうんですか??
42デフォルトの名無しさん:2010/01/17(日) 18:53:06
>38
それユーザー側が obj_pool を明示的に使うの?
Factory 関数作って deleter を適正に設定した shared_ptr を返すとか。
43デフォルトの名無しさん:2010/01/17(日) 18:53:35
>>41
それ、クラステンプレートじゃなくて関数テンプレート。
下の二つは、テンプレート引数が違う。
4441:2010/01/17(日) 19:19:21
>>43
すいません。例を挙げるために書いたもので。

>下の二つは、テンプレート引数が違う。
ということは・・・?
45デフォルトの名無しさん:2010/01/17(日) 19:20:48
>>411
同じだったと思う。
型名の(*)は*を省略可能だから()にできて、
さらに()も省略可能なので。
4641:2010/01/17(日) 19:24:39
そうだったんですか!
ありがとうございます。
47デフォルトの名無しさん:2010/01/17(日) 19:25:45
class Foo {
public:  
  Foo();
  ~Foo();
private:
  static std::vector<int> m_vec;
};

static std::vector<int> m_vec;
この正しい初期化の仕方を教えてください。
48デフォルトの名無しさん:2010/01/17(日) 19:29:02
>>45
http://codepad.org/C77yrjrC

これの結果を見る感じ省略ではないと思うけど・・・
49デフォルトの名無しさん:2010/01/17(日) 19:37:46
>41
上は関数型で下は関数へのポインタ型。
至る所で関数型は関数へのポインタ型に調整されてしまうので
func<void(int, int)> も引数の型は関数へのポインタ型になっている。
でも T 自体は関数型のままでオブジェクト型ではないから例えば
T obj2 = obj; みたいなことはできない。
関数へのポインタ型の場合は可能。
http://codepad.org/RIyF5kFS
50デフォルトの名無しさん:2010/01/17(日) 19:55:04
へー勝手にポインタになってしまうのかなるほど
51デフォルトの名無しさん:2010/01/17(日) 20:35:24
>>47です
お願いします。
52デフォルトの名無しさん:2010/01/17(日) 20:37:54
static std::vector<int> m_vec(コンストラクタ引数);
53デフォルトの名無しさん:2010/01/17(日) 20:54:37
static std::vector<int> m_vec;
memset(&m_vec, 0, sizeof(m_vec));
54デフォルトの名無しさん:2010/01/17(日) 20:55:42
>>53 やめろやめろ
55デフォルトの名無しさん:2010/01/17(日) 20:58:00
>>47
std::vector<int> Foo::m_vec;
これでデフォルトの初期化を行う定義ができる。
初期化引数が指定したかったら
std::vector<int> Foo::m_vec(...);
56デフォルトの名無しさん:2010/01/17(日) 21:27:18
>>47 です、上手くいきません
>>55
static なvectorコンテナなのですが・・・・?
57デフォルトの名無しさん:2010/01/17(日) 21:38:05
static std::vector<int> m_vec(コンストラクタ引数);
をヘッダに書いてるってオチだな
58デフォルトの名無しさん:2010/01/17(日) 21:52:01
この記述ってセーフですか?
const hoge& func(const hoge& a)
{
return a;
}

void func2()
{
const hoge& a=func(hoge());
a.func3(); ///ここで、上の行のhoge()一時オブジェクトの参照はセーフ?
}
59デフォルトの名無しさん:2010/01/17(日) 21:58:01
constならおk
60デフォルトの名無しさん:2010/01/17(日) 22:16:30
>>56
「上手くいきません」じゃわからん。
期待する結果と、そのために何をしたのかと、実際の結果を出せ。
61デフォルトの名無しさん:2010/01/17(日) 22:17:18
>>58
アウト。
最初の文の終わりで一時オブジェクトは死ぬ。
62デフォルトの名無しさん:2010/01/17(日) 22:39:22
>>61
むむむ、やっぱりそうですか。ありがとうです
6341:2010/01/17(日) 23:18:49
>>49
いいサイトってありませんかね?
64デフォルトの名無しさん:2010/01/17(日) 23:26:34
>>15お願いします。
65デフォルトの名無しさん:2010/01/17(日) 23:34:31
66デフォルトの名無しさん:2010/01/17(日) 23:36:55
>>65
死んでしまえばいいのに
67デフォルトの名無しさん:2010/01/17(日) 23:43:07
>>65
ワロスw
68デフォルトの名無しさん:2010/01/18(月) 00:16:24
LokiダウンロードしてREADME読めばいいのに…
なんでそんなことも出来ないの?
69デフォルトの名無しさん:2010/01/18(月) 06:38:44
書いてない書いてない
70デフォルトの名無しさん:2010/01/18(月) 13:00:32
READMEに書いてないなら
仮に誰かが回答したとしても当てずっぽう以外にはあり得ないということ。
71デフォルトの名無しさん:2010/01/18(月) 18:48:18
さっき知ってショックを受けたんですが
「char」型ってもう使う意味ないんですかね?
C++的にはchar/unsigned char/signed charは別な型だとは

C++2003 3.9.1 Fundamental types
(C99 6.2.5 Types)
72デフォルトの名無しさん:2010/01/18(月) 19:02:44
なぜ?
"Hello, World!" は char 型の配列だぜ
signed でも unsigned でもなく
73デフォルトの名無しさん:2010/01/18(月) 19:16:01
charのsigned/unsignedが実装依存だと
たとえばcharに対する右シフトのコードはバグの元になるから
意識してsigned/unsignedを付けるべきかなって思ったわけです

でも、リテラルがchar型だと使わざるを得ないですね
intとshortは省略するとsignedなのになんでcharだけ特殊なんでしょう
やっぱ過去の遺産?
74デフォルトの名無しさん:2010/01/18(月) 21:33:54
>63
規格をあたるのが一番だと思う。初見だと厳しいとは思うけど。
使用例なら Boost Function とか Boost Function Types 辺りで見つけられるんじゃないかと思う。
後、C++ Templates The Complete Guide の Chapter 22 がちょっとだけ参考になるかもしれない。

>73
C の char 自体が signed / unsigned 実装依存だったわけだし。
C99 Rationale 見ると signed char, unsigned char の導入自体が C89 時点のもので、
"plain" char の signed / unsigned が実装依存なのは従来の慣行に従い(as in prior practice)
って書いてある。
75デフォルトの名無しさん:2010/01/18(月) 21:38:59
洋書の良書とかってどっから見つけてくるんだ?
76デフォルトの名無しさん:2010/01/18(月) 21:54:13
>>73
charを純粋に文字型として使えば問題nothing
1バイト整数として使いたいなら

typedef signed char sbyte;
typedef unsigned char byte;

とか?
77デフォルトの名無しさん:2010/01/18(月) 22:18:35
構造体は以下のように宣言と同時に初期化できますが、

struct TEST stTest = { 0, 1, 2 };

クラスのメンバ構造体をこのような = { ・・・ }のカタチで初期化することはできないのでしょうか?
78デフォルトの名無しさん:2010/01/18(月) 22:20:12
全部パブリックだったらできる
それかC++0xを待つか
79デフォルトの名無しさん:2010/01/18(月) 22:56:11
配列用途の参照を含む構造体にうっかりコンストラクタ書いたりしてerrとか
もう泣けてくる程使いにくいよね
80デフォルトの名無しさん:2010/01/18(月) 23:14:58
>>78
ありがとうございます。

少し違った質問で、

typedef struct
{
  int X;
  int Y;
}
stTEST;

class CTest
{
  ・・・
protected:
  map<string,stTEST> m_mapTest
};

で、これのm_mapTestの要素の初期化を今はコンストラクタ内で

  stTEST stTest = { 1, 2 };
  m_mapTest[ "てすと" ] = stTest;

というふうにしてるんですが、これを一文で簡潔に書くことはできないでしょうか?
たとえば、

  m_mapTest[ "てすと" ] = { 1, 2 }; // これはエラーになってしまいますが

こんな感じです。
81デフォルトの名無しさん:2010/01/18(月) 23:31:31
>80
stTEST にコンストラクタを作れば
m_mapTest["てすと"]=stTEST(1,2);
とはできる。
これも C++0x で stTEST{1,2} みたいにできるようになるんだっけ?
8280:2010/01/18(月) 23:44:12
>これも C++0x で stTEST{1,2} みたいにできるようになるんだっけ?
おー、まさにやりたいのがそれです。
それをそのままmapに放り込んでやりたいのですよ。
新C言語は他にもスマートポインタが標準化されたりとうれしいことが多いですね。

構造体にコンストラクタを設けるのは個人的な信条から抵抗があるのですが、
有効とあらば考え方を改めたいですし、検討します。

教えてくださって、ありがとうございました!
83デフォルトの名無しさん:2010/01/18(月) 23:59:56
template <class T, class A1> T make_pod(const A1 &a1) { T t = { a1 }; return t; }
template <class T, class A1, class A2> T make_pod(const A1 &a1, class A2 &a2) { T t = { a1, a2 }; return t; }
・・・

↑のようなコードを十分な引数数に対応できるように(20もあれば十分すぎると思う)、スクリプトに吐かせて

func(make_pod<hoge>(a1, a2, a3));

とするとか。コンストラクタを作った場合よりコピーコストが増えるのが気になるけどクライアントコード自体は1行になるよ
84デフォルトの名無しさん:2010/01/19(火) 00:39:34
vectorにクラス型ポインタを格納して、クラス内メンバ変数の値によってソートしたいんですが、例えば下のように

class Character {
protected:
int AGI;
public:
void SetAGI(int agi){ AGI = agi; }
int GetAGI(){ return AGI; }
bool operator<(const Character &a) const { return (AGI < a.AGI); }
};

bool greater(const Character* &a, const Character* &b) { return *a < *b; }

class Player : public Character {};
class Enemy : public Character {};

int main()
{
vector<Character*> Member;
Player* P[3]; Enemy* E[3];
for(int i=0; i<3; i++){ P[i] = new Player; E[i] = new Enemy; Member.push_back(P[i]); Member.push_back(E[i]); }
P[0]->SetAGI(4); (以下、〜P[2]、E[0]〜E[2]まで適当なAGIの値を入れる)

sort(Member.begin(),Member.end(),::greater);

       (delete処理)
}

をVC++2008でコンパイルしようとしても
「 bool (const Character *&,const Character *&)' : 2 番目の引数を 'Character *' から 'const Character *&' に変換できません。 」
とエラーが出ます……ポインタでのソートすることはやはりできないのでしょうか?
8580:2010/01/19(火) 00:49:37
>>83
ありがとうございます。
そういうふうにすることもできるんですね。
8684:2010/01/19(火) 00:52:32
すみません自己解決しました
87デフォルトの名無しさん:2010/01/19(火) 15:57:06
std::stringのc_strの戻り値のスコープはどうなっているんですか?
既存の文字列ポインタを返しているんですか?
88デフォルトの名無しさん:2010/01/19(火) 16:47:15
用語の使い方が変な気がするが、そのstringオブジェクトのスコープと一緒だろ
89デフォルトの名無しさん:2010/01/19(火) 17:31:27
>>87
知りたいのはスコープじゃなくて、いつまで有効かでしょ?
元のstd:stringの非constなメンバ関数を呼び出すか、std::stringが破壊されるまで有効です。
90デフォルトの名無しさん:2010/01/19(火) 20:56:05
>>89
あれ? いつ変動するかがstringの気分だから、その場その場以外では使わないでね的な事が本に書いてあったけど、非constなメンバ関数を呼び出すってのがそれに当たるのか・・?

 std::string a = "hogehoge";
 char *c = a.c_str();
って感じでそのポインタ後で使おうとしちゃダメ、みたいな。
91デフォルトの名無しさん:2010/01/19(火) 21:03:16
>>90
俺も
>元のstd:stringの非constなメンバ関数を呼び出すか、std::stringが破壊されるまで有効です。
って聞いているが。
聞いているじゃなくて誰かが規格を開いてくれることを期待
92デフォルトの名無しさん:2010/01/19(火) 21:40:43
母国語が英語なら英語で書いてくれてもいい
93デフォルトの名無しさん:2010/01/19(火) 22:09:50
保証がなくなる時期が明らかにされないということは、安心して使える時期が存在しないということだろjk
だったら c_str 自体の存在意義がないわけだが
94デフォルトの名無しさん:2010/01/19(火) 22:16:46
>>87-93
規格にはこう書いてある↓

21.3.6 basic_string string operations [lib.string.ops]
const charT* c_str() const;
1 Returns: A pointer to the initial element of an array of length size() + 1 whose first size() elements
equal the corresponding elements of the string controlled by *this and whose last element is a
null character specified by charT().
2 Requires: The program shall not alter any of the values stored in the array. Nor shall the program treat the
returned value as a valid pointer value after any subsequent call to a non-const member function of the
class basic_string that designates the same object as this.
95デフォルトの名無しさん:2010/01/19(火) 22:46:14
>>90
std::string a;
aに対して何かしらの操作が行われなければ内部バッファのメモリ領域も変更されないでしょ。
たとえば非constな操作によって別のメモリ領域に移動する場合はあるけど
constな操作(c_str)のようなものなら別のメモリ空間が再割り当てされる心配もない。
96デフォルトの名無しさん:2010/01/19(火) 22:56:33
>>95
> aに対して何かしらの操作が行われなければ内部バッファのメモリ領域も変更されないでしょ。
それは希望的観測じゃない?
「何かしらの操作が行われなければ内部バッファのメモリ領域も変更されない」
が規格で保証されていれば良いけど。
例えば
#include <iostream>
int main()
{
double * p =new double(10.5);
*p=3.8;
delete p;
std::cout << *p << std::endl;
return 0;
}
これだって、3.8が表示されるかもしれないけどそうでないこともあるじゃない。
要は動くかどうかじゃなくて規格で本当に大丈夫と保証されているかどうか。



まあ
>>94
が結論を書いてくれているが。
97デフォルトの名無しさん:2010/01/19(火) 23:27:37
>>96
>delete p;
何かしらの操作がされていると思うのだが。
98デフォルトの名無しさん:2010/01/20(水) 03:02:52
何かしらの操作だなどう考えても
9996:2010/01/20(水) 05:34:11
>>97-98
うむ。
確かに何かしらの操作だな。
あんま良い例だとは言えなかった。

じゃあstd::stringの内部のバッファが連続しているとは限らないとかがよかったかな?

まあ要するに
> 希望的観測やこんな実装が多いってのではなくその挙動が
> 規格で保証されていれば良いけど。
ってのが言いたいだけだ。
100デフォルトの名無しさん:2010/01/20(水) 06:16:06
結局規約(>>94)には
c_strの戻り値は非constメンバを呼ぶと無効になる
=非constメンバを呼ぶまでは有効
と書いてるでおk?
101デフォルトの名無しさん:2010/01/20(水) 10:29:21
The return value is valid only as long as the string exists, and as long as only constant functions are called for it.
102デフォルトの名無しさん:2010/01/20(水) 10:55:43
ifstream fin;
string str;
while ( fin.get(str) ) { stringstream line(str); ... }

をstr無しでやる方法はないですか?

ifstream fin;
stringstream line;
while ( fin.get(line) ) { ... }
みたいな感じで
103102:2010/01/20(水) 10:59:57
間違えた
ifstream fin;
string str;
while ( std::getline(fin, str) ) { stringstream line(str); ... }
104デフォルトの名無しさん:2010/01/20(水) 12:31:27
結局非constな物を呼ばなければ大丈夫なのか。
勉強になったわ。
105デフォルトの名無しさん:2010/01/20(水) 18:51:27
>>99
>std::stringの内部のバッファが連続しているとは限らない
えっ?そうなのか?
「内部のバッファが連続しているとは限らない」なら普通にc_str()の呼び出しで一回だけ使うことですら危険じゃないだろうか。

仮にstd::stringのc_str()の実装が((以下、実際の実装がそうなっているという意味ではないぞ))
「内部的に連続していないかもしれない領域を保持しており、c_str()の呼び出しで再度領域の割り当てを行い、連続したバッファを返却する仕様」だとしても、
「返却された値がいつ無効になるのか分からない仕様」だとすると、前述したように「c_str()の呼び出しで戻り値を一回だけ使うことですら危険」だよな。
つまり、何かしらの無効になるタイミングがあるはずでそれが>>89だろ。
>>93でも言われているわけだが。

まぁ>>94が結論を書いてくれているが。
106デフォルトの名無しさん:2010/01/20(水) 19:47:53
参照カウンタだったり、文字数によってはヒープじゃなくてスタックつかったり、色々と実装がバラエティーに富んでいるから今は連続してる保証はないよ
c_strはconst引数のレガシーコード直渡し専用だな
107デフォルトの名無しさん:2010/01/20(水) 19:53:19
>>105
> えっ?そうなのか?
そうなんだよ。

もし連続していることが保証されていたら、
string::iteratorは仕様でchar*に固定されていただろうし、
c_str()なんてメンバ関数も無かったかもね(begin()で済んでしまう)。
108デフォルトの名無しさん:2010/01/20(水) 20:02:59
>>105
規格と現実大分違うから夢から覚めなさいー
10999:2010/01/20(水) 21:08:44
>>105
> > >std::stringの内部のバッファが連続しているとは限らない
> えっ?そうなのか?
そうなんだよ。
意外に知らない人(というか決めつけている人)が多いんだよね。

>>107氏の解答が分かりやすいよね。ありがとうございます。


あと俺は
C++0xではstd::stringの内部のバッファの連続が保証されるという
夢を見たのだが、今年こそ正夢になるんだっけ?
110デフォルトの名無しさん:2010/01/20(水) 21:09:52
今度の規格改訂で連続性は保証されるようになったよ。
そういえばstd::vectorも以前は連続性の保証はなかったよね。
111デフォルトの名無しさん:2010/01/20(水) 21:12:07
以前っていつだ
規格制定後Defect Report Listが出るまでの間のことか?
112デフォルトの名無しさん:2010/01/20(水) 21:16:59
とりあえず、内部のバッファが連続しているかいないかに関わらず、>>105はその後の段落がメインなので。
113デフォルトの名無しさん:2010/01/20(水) 21:19:43
結構前だな

69. Must elements of a vector be contiguous?
Section: 23.2.4 [lib.vector] Status: TC Submitter: Andrew Koenig Date: 29 Jul 1998

http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/lwg-defects.html#69
114デフォルトの名無しさん:2010/01/20(水) 21:35:00
>>112
その後の段落は要するに>>93>>94の内容だから、>>105宛にレスする所はまったく無くて、
だから>>105特有の箇所にだけレスが付いたんだろう。
115デフォルトの名無しさん:2010/01/20(水) 21:36:12
もうどうでもいいっすよ!!
116デフォルトの名無しさん:2010/01/20(水) 21:48:30
>>107
char* でも構わないというだけで、char* でなければならない理由にはならない
begin() の他に data() もあるように、string は冗長性が残っているクラスだ
117デフォルトの名無しさん:2010/01/20(水) 21:57:35
>>116
だから、皆その話をしてるんでしょ。
118デフォルトの名無しさん:2010/01/20(水) 22:20:02
>>102-103
getline(fin, line) できるローカルな関数でも作れば?
119デフォルトの名無しさん:2010/01/21(木) 18:19:12
馬鹿だなw
120デフォルトの名無しさん:2010/01/22(金) 13:37:08
began()
121デフォルトの名無しさん:2010/01/23(土) 14:00:26
WindowsXP visual c++2008でライブラリ****.aを読み込むかlibに変換する方法ありますか。
122デフォルトの名無しさん:2010/01/23(土) 15:01:14
そんなことが出来るわけがない
ソースがあればWindows用にコンパイルし直せ
なければ諦めろ
あとスレ違い
123デフォルトの名無しさん:2010/01/23(土) 18:36:47
intが要素のツリーをtemplateで作って,
全要素をprintfするコードを書いたつもりだったのですが,
どうにもエラーが解決できません.
上手くいく方法はないでしょうか?
↓ソース
http://codepad.org/HfJ9VV39
//エラー gcc 3.4.4
piyohoge.cpp: In static member function `static void IterPrint<Tree<x, children> >::invoke()':
piyohoge.cpp:26: error: type/value mismatch at argument 1 in template parameter list for `template<template<class> class f, class xs> struct Iter'
piyohoge.cpp:26: error: expected a class template, got `IterPrint<Tree<x, children> >'
piyohoge.cpp:26: error: invalid type in declaration before ';' token
124デフォルトの名無しさん:2010/01/23(土) 19:25:22
>123
そりゃ template<class>
125デフォルトの名無しさん:2010/01/23(土) 19:26:19
操作ミスった
そりゃ template<class> 要求されてるところに template<int, class>渡したらエラーにもなるだろ
126デフォルトの名無しさん:2010/01/23(土) 19:46:40
それ以前の問題が多そう。
#include <stdio.h>
struct Nil{};
template <int x, typename L, typename R> struct Tree { static const int value = x; };
template <typename F, typename T> struct Iter;
template <typename F, typename L, typename R> struct Iter<F, Tree<L,R> > {
static void invoke() { F<Tree<L,R>::x>::invoke(); Iter<F, L>::invoke(); Iter<F, R>::invoke(); } };
template <typename F, typename R> struct Iter<F, Tree<Nil, R> > {
static void invoke() { F<Tree<Nil,R>::x>::invoke(); Iter<F, R>::invoke(); } };
template <typename F, typename L> struct Iter<F, Tree<L, Nil> > {
static void invoke() { F<Tree<L,Nil>::x>::invoke(); Iter<F, R>::invoke(); } };
template <typename F> struct Iter<F, Tree<Nil, Nil> > {
static void invoke() { F<Tree<L,Nil>::x>::invoke();} };
template <int x> struct Print { static void invoke() { printf( "[%d]\n", x ); } };
typedef Tree<0, Tree<1, Tree<2, Nil, Nil>, Nil>, Tree<3, Nil, Nil> > test_tree;
int main() { Iter<Print, test_tree>::invoke(); }
127デフォルトの名無しさん:2010/01/23(土) 19:49:46
貼るコード間違えた。連投失礼。
#include <stdio.h>
struct Nil{};
template <int x, typename L, typename R> struct Tree { static const int value = x; };
template <typename F, typename T> struct Iter;
template <typename F, int x, typename L, typename R> struct Iter<F, Tree<x, L,R> > {
static void invoke() { F::invoke<Tree<x,L,R>::value>(); Iter<F, L>::invoke(); Iter<F, R>::invoke(); } };
template <typename F, int x, typename R> struct Iter<F, Tree<x, Nil, R> > {
static void invoke() { F::invoke<Tree<x,Nil,R>::value>(); Iter<F, R>::invoke(); } };
template <typename F, int x, typename L> struct Iter<F, Tree<x, L, Nil> > {
static void invoke() { F::invoke<Tree<x,L,Nil>::value>(); Iter<F, L>::invoke(); } };
template <typename F, int x> struct Iter<F, Tree<x, Nil, Nil> > {
static void invoke() { F::invoke<Tree<x,Nil,Nil>::value>();} };
struct Print { template <int x> static void invoke() { printf( "[%d]\n", x ); } };
typedef Tree<0, Tree<1, Tree<2, Nil, Nil>, Nil>, Tree<3, Nil, Nil> > test_tree;
int main() { Iter<Print, test_tree>::invoke(); }
128これでいいよ:2010/01/23(土) 20:33:27
#include <stdio.h>
struct Nil{};
template<int x, typename left, typename right> struct Tree{};
template<typename f, typename t> struct Iter;
template<typename f> struct Iter<f, Nil>{ static void invoke(){} };
template<typename f, int x, typename left, typename right> struct Iter<f, Tree<x,left,right> > {
static void invoke(){
f::template invoke<x>();
Iter<f, left>::invoke();
Iter<f, right>::invoke();
}
};
struct PrintIter {
template<int x>
static void invoke() {
printf( "[%d]\n", x );
}
};
typedef Tree<0, Tree<1, Tree<2, Nil, Nil>, Nil>, Tree<3, Nil, Nil> > test_tree;
int main()
{
Iter<PrintIter,test_tree>::invoke();
}
129123:2010/01/23(土) 22:30:51
>>125
template<class tr> struct IterPrintで宣言したものを,
template<int x, class children> struct IterPrint<Tree<x,children> >で特殊化しているのですが,
特殊化したIterPrint内でIterPrintをIterに渡すところで,特殊化した版のIterPrintが
渡されてしまっているので上手くいってないんではと想像しています.
これを特殊化しない版のIterPrintを渡せないのかなと.

>>128
ありがとうございます.
なるほど二分木だときれいに書けるのかー.
何も考えずに子をリストで持とうとしていました.
130デフォルトの名無しさん:2010/01/24(日) 15:15:50
123とは別人だけどf::templateっていう構文は何物ですか?
131デフォルトの名無しさん:2010/01/24(日) 15:29:51
関数(継承クラスのコンストラクタから親クラスのコンストラクタ呼び出し)の引数に
boost::shared_ptrを設けているのですが、NULLを引数に渡してその関数をコールすると、
コンパイラに

1 番目の引数を 'int' から 'boost::shared_ptr<T>' に変換できません。

と怒られてしまいます。

親クラスにデフォルトコンストラクタなどを用意しておけば、この引数付きコンストラクタを
呼ばないで済むのですが、
できるだけ統一的に扱いたいのと、その他の場面で同様の問題があるかもしれないことから、
NULLを代入する(無効なポインタにする)方法を知りたいです。

ご助言、よろしくお願いします m(_ _)m
132デフォルトの名無しさん:2010/01/24(日) 16:16:33
static_cast<T*>(NULL)
133デフォルトの名無しさん:2010/01/24(日) 16:26:53
boost::shared_ptr<int>()
134デフォルトの名無しさん:2010/01/24(日) 16:27:17
int→T
135131:2010/01/24(日) 16:54:09
>>132
>>133
できました!
ありがとうございました!
136デフォルトの名無しさん:2010/01/24(日) 18:50:47
>130
>128 じゃないけど。型であることを明示する typename の親戚みたいなもん。
. -> :: の左側が依存型である場合に次に来るのが member template であることを明示する。無いと < が比較演算子として解釈される。
ttp://www.comeaucomputing.com/techtalk/templates/#templateprefix
137デフォルトの名無しさん:2010/01/24(日) 20:17:38
>>136
どうも。クラスがテンプレート関数を持つ場合に必要なわけですね
関数テンプレートはあまり使わないから知らなかったっす

>>128
tree_dataを変えないなこんな感じに
codepadって初めてつかた
ttp://codepad.org/D8QumP07
138デフォルトの名無しさん:2010/01/24(日) 21:03:33
codepadかなり便利だよ。
C/C++に限らず別の言語もおkだし、
plain textをうpするのにも便利。
139デフォルトの名無しさん:2010/01/25(月) 10:37:18
vc++限定かな?ってコードを試すときにcodepadつかうわ
140デフォルトの名無しさん:2010/01/25(月) 20:25:46
>>139
g++使えばいいのに。
というかComeau C++使えば
標準準拠度を確かめるには最適。
141デフォルトの名無しさん:2010/01/26(火) 04:04:24
template < class T > void F( T t );
という関数があって、
TがX(int)というメンバ関数を持ってたら、そのXを呼び出し、
持っていなかったら、別の処理をする。ってことをtemplateで出来ませんか?
142デフォルトの名無しさん:2010/01/26(火) 04:42:24
templateで受け取った任意の型の配列と同じサイズの領域を構造体スコープに確保する時は
boostのalignment_storageは使わずに適当にchar buffer[sizeof(T[N])];なんてしていいんでしょうか。
不安なのでchar buffer[sizeof(boost::array<T, N>)];ってしてます><
143デフォルトの名無しさん:2010/01/26(火) 06:41:35
>>141
boostにそれっぽいのがあった気がする。
「boost has_member」あたりでググってみてくれ。
144デフォルトの名無しさん:2010/01/26(火) 17:39:51
↓の2つのクラス、PogeまでしなくてもMogeで十分ですよね?

スマートポインタを覚えたので使ってみようかと思ってるんですが
とりあえずPogeみたいにフル?につけたら
変数のアクセスへの構文が大変になってしまいました

typedef list<shared_ptr<wstring> > strlist;
class Poge{
auto_ptr<strlist> m_pslist; //m_pslistは常にPogeが所有
//...
};
class Moge{
strlist m_slist;
//...
};
145デフォルトの名無しさん:2010/01/26(火) 18:06:45
>>144
そのリストの所有権がオブジェクトの間を移動しないならMogeで十分だろ
146デフォルトの名無しさん:2010/01/26(火) 19:01:12
さんクスコ
147デフォルトの名無しさん:2010/01/27(水) 00:53:28
#include <hash_map>
ってやると警告がでるんだけど、古いの?
環境はg++ (Ubuntu 4.3.3-5ubuntu4) 4.3.3
148デフォルトの名無しさん:2010/01/27(水) 00:59:14
でないよ
149147:2010/01/27(水) 01:14:17
/usr/include/c++/4.3/backward/backward_warning.h:33:2:
warning: #warning This file includes at least one deprecated or antiquated header which may be removed without further notice at a future date.
Please use a non-deprecated interface with equivalent functionality instead. For a listing of replacement headers and interfaces, consult the file backward_warning.h.
To disable this warning use -Wno-deprecated.
こんなのが出る
150デフォルトの名無しさん:2010/01/27(水) 01:17:57
C++でstrlenより高速なstrlenを探してます
151デフォルトの名無しさん:2010/01/27(水) 01:25:07
アセンブラで書かないと_
152デフォルトの名無しさん:2010/01/27(水) 01:27:32
C++でstrlenより高速なstrlenより高速なstrlenを探してます
153デフォルトの名無しさん:2010/01/27(水) 01:43:36
154デフォルトの名無しさん:2010/01/27(水) 04:14:46
初心者なんだけど、条件で
「○○ かつ △△ もしくは □□ かつ ◇◇だったら」なんてのを考えたら

if(○○ && △△ || □□ && ◇◇)

ってなるけどコレってもっとスマートに書けないん?
155デフォルトの名無しさん:2010/01/27(水) 04:31:13
>>154
例えばどういう風に書けたらスマートだと思うん?
156デフォルトの名無しさん:2010/01/27(水) 05:11:12
「短く・わかりやすく」かな
157デフォルトの名無しさん:2010/01/27(水) 05:17:00
>>156
いや、そうじゃなくて、具体的にどう記述できたらスマートだと思うん?
158デフォルトの名無しさん:2010/01/27(水) 05:19:08
「○○ かつ △△ もしくは □□ かつ ◇◇だったら」

if(○○ && △△ || □□ && ◇◇)
以上に「短く・わかりやすく」なんて書けないと思うが。
159デフォルトの名無しさん:2010/01/27(水) 05:28:23
マクロか関数にしとくぐらいしか
160デフォルトの名無しさん:2010/01/27(水) 09:01:18
>>154
括弧がないとさっぱりわからん。
161デフォルトの名無しさん:2010/01/27(水) 15:33:54
横幅の短さを優先して複数行に分けたり、とか?
つーかそんな細かい所の見た目の綺麗さを気にしてたら永遠に先に進めないと思うんだが・・・
162デフォルトの名無しさん:2010/01/27(水) 16:51:45
hogeはいいけど
moge、pogeの由来ってなに?
163デフォルトの名無しさん:2010/01/27(水) 16:53:15
modification
physical
通りました
165デフォルトの名無しさん:2010/01/27(水) 22:50:57
>141
SFINAE 使えば一応実装はできるだろうけど(規格的にも現実的にも)移植性のある方法ではないはず。
関数の signature が一致したところその挙動まで一致する事が保証されるわけじゃないから、
個人的には traits を使うべきじゃないかと思っている。

>142
単純に同一サイズ確保したいだけなら sizeof(T[N}) でも sizeof(T)*N でもいいだろうけど、
その型としてアクセスするんだったらアラインメント考える必要があるんで、char 型の時点で駄目ぽ。

>147
今なら tr1/unordered_map 使うんじゃないの?
166デフォルトの名無しさん:2010/01/27(水) 22:59:49
traitsの定義ってなんなの?
テンプレートいじってていつもこれはtraitsと言っていいもののかな?って迷うわ
167デフォルトの名無しさん:2010/01/28(木) 02:17:21
それはネイティブ達にとっても永遠の謎だから日本人に分かるわけがない
168デフォルトの名無しさん:2010/01/28(木) 13:41:10
メンバ関数のvirtual指定をしたばあいの仮想テーブルの実装って規格で決まってるんでしょうか
あるインターフェースを継承したオブジェクトを動的ライブラリ側で生成して主プログラムで扱うばあいに
主プログラムと動的ライブラリをコンパイルしたコンパイラが別物でも安全なんでしょうか?
169デフォルトの名無しさん:2010/01/28(木) 14:04:39
決まっていません
安全ではありません
単純な単一継承のクラスで、メンバ関数を普通に呼ぶだけの場合は、
“たまたま” 互換性のある構造になっていて、問題ないことが多いですが、保証されてはいません
170デフォルトの名無しさん:2010/01/28(木) 16:48:11
そうなんですか・・・残念
packしたPOD構造以上のものは渡さないほうがいいみたいですね
171デフォルトの名無しさん:2010/01/28(木) 20:03:35
std::string ret1(){return *(new std::string("abc"));}
こんな関数があったときに、受け取り側でちゃんとメモリ解放するにはどうやればよいのですか?
string &r(ret1());
cout << r << endl;
r.~basic_string();
どうやってもメモリリークしてしまいます
string* p=NULL;
*p=ret1();
delete(p);

172デフォルトの名無しさん:2010/01/28(木) 20:06:50
>>171
不可能
173デフォルトの名無しさん:2010/01/28(木) 20:16:38
>>171
#include <string>
#include <iostream>
std::string *ret1(){return new std::string("abc");}
std::string ret2(){return std::string("abc");}
int main() {
std::string* p=NULL;
p=ret1();
std::cout << *p << std::endl;
delete(p);

std::string s(ret2());
std::cout << s << std::endl;

p=ret1();
std::string s2(*p);
std::cout << s2 << std::endl;
delete(p);
return 0;
}

1) ポインタで返してポインタを使う
2) 実物を返して代入して使う
3) ポインタを返してコピーコンストラクタへ渡して使う
174デフォルトの名無しさん:2010/01/28(木) 21:07:05
>>172-173
さっきみたいな書き方はしないことにします
ありがとうございました
175デフォルトの名無しさん:2010/01/29(金) 09:16:00
パラメーターと処理をカプセル化して同じ型の引数としてほかの関数に渡したいんですが
template+functorだと実行時に動的にできない
仮想関数+functorだとnew/deleteのコストがかかるし、参照だと寿命に融通が利かない
クロージャってC++では再現できませんかね?
176デフォルトの名無しさん:2010/01/29(金) 10:08:10
>>175 boost::function or std::function (C++0x only)
177デフォルトの名無しさん:2010/01/29(金) 10:44:15
>>176
それだと結局中の人がtemplateもnewも使ってますけど・・・
178176:2010/01/29(金) 11:30:47
>>177
確かに template は使ってるが動的に(引数を束縛)できるし、
以下のプログラムで new が使われていないことも確認した。

#include <cstdio>
#include "boost/function.hpp"
#include "boost/bind.hpp"
#include "boost/version.hpp"
void* operator new (std::size_t s) { throw std::bad_alloc(); }
int main()
{
  boost::function<void (char const*)> print(bind(&std::fputs, _1, stdout));
  print("Using boost "BOOST_LIB_VERSION"\n");
}

$ g++ test.cpp && ./a
Using boost 1_39
179デフォルトの名無しさん:2010/01/29(金) 12:01:30
>>175
C++ 以外の言語にあるクロージャは new/delete 相当のコストがかからないのかい?
180デフォルトの名無しさん:2010/01/29(金) 12:07:22
ローカル関数がある言語は実質的にクロージャサポートと誰かが言ってた

int f(){
struct impl{static int g(){return 10;}};
return impl::g();
}
181デフォルトの名無しさん:2010/01/29(金) 13:17:19
>180
何をどこに囲い込んだんだ?
182デフォルトの名無しさん:2010/01/29(金) 13:43:20
>>178
Oh...関数ポインタの場合はnewしないんですね知らなかった
bindってどうやって実装してるのか謎ですわ
183デフォルトの名無しさん:2010/01/29(金) 13:48:07
その辺は知らん
184デフォルトの名無しさん:2010/01/29(金) 23:54:15
学生の者なのですが、経験者の皆様にお伺いします。

C++プログラムのソースコードの文字コードは
結局何にするのがいいんでしょうか?

開発環境にも依るとは思いますが、
一般論でこれがいいとか
これが無難だとかありますでしょうか?

よろしくお願いします。
185デフォルトの名無しさん:2010/01/30(土) 00:09:40
「EBCDICは勝利」
「Unicode不許可」
「トライグラフで万全」
186デフォルトの名無しさん:2010/01/30(土) 00:13:53
OSネイティブの文字コードで。
187184:2010/01/30(土) 00:27:37
>>185
どうしてそういう意地悪なことを言うのですか

>>186
やっぱそうなりますか。

 コメントの中以外にASCII文字以外が出て来ないなら
 文字コードは何でもいい。
・・・なんてことにはなりますか?
188デフォルトの名無しさん:2010/01/30(土) 01:17:30
こりわびっくり・・・あすきぃこぉどが出たようです
189デフォルトの名無しさん:2010/01/30(土) 02:07:52
>>182
boost::function が new を使うかどうかは、関数ポインタの場合じゃなくて、処理と引数を
記憶するために必要な領域の大きさによって決まる。
190デフォルトの名無しさん:2010/01/30(土) 02:09:54
>>184,187
環境に合わせて選べ、っていう一般論。
191デフォルトの名無しさん:2010/01/30(土) 06:15:03
アクセス指定子って英語でなんていうの?
192デフォルトの名無しさん:2010/01/30(土) 06:42:34 BE:540287429-2BP(0)
Visual StudioならTCHARにしてプロジェクト設定で切り替え
ってのをよく見るな。
マルチバイト版がなんのために必要なのかよく分からない。
速度の問題?
193デフォルトの名無しさん:2010/01/30(土) 06:46:46
仮想関数を持っているクラス、または仮想関数を持っているクラスを継承したクラスは
ポインタでの操作やキャストが行われない限り仮想関数テーブルを用いたオーバーライドの動的解決はされず
速度には影響しないと考えていいのでしょうか。
194デフォルトの名無しさん:2010/01/30(土) 08:55:16
実測あるのみ
195デフォルトの名無しさん:2010/01/30(土) 11:11:15
オーバーライドの動的解決の速度なんか気にする前に、
きっと他のボトルネックが見つかるはずw
196デフォルトの名無しさん:2010/01/30(土) 11:27:52
>>192
Win95/98/Meで動かす場合のため
もはや過去の遺物
197デフォルトの名無しさん:2010/01/30(土) 12:25:26
int my::lstrcmp(const char *str1, const char *str2) { return lstrcmpA(str1, str2); }
int my::lstrcmp(const wchar_t *str1, const wchar_t *str2) { return lstrcmpW(str1, str2); }

c++だったら↑のようにラップしたほうが使いやすい
198デフォルトの名無しさん:2010/01/30(土) 14:59:25
>>193
?ポインタでアクセスするかどうかなんて、
オーバーライドの動的解決に関係ないだろ。
199デフォルトの名無しさん:2010/01/30(土) 15:31:55
C++の文字列比較が遅いです
何かいい方法ないですか?
200デフォルトの名無しさん:2010/01/30(土) 15:54:20
仮想関数テーブル参照のオーバーヘッドを気にする書き込み結構多いね

携帯電話なんかでもSymbianがフレームワークとして仮想関数使いまくりだし
パレートの法則にあたるようなボトルネックは大抵別にあるだろうし
C++で開発するレベルの機器で気にしてもしょうがないんだろうがなぁ
201デフォルトの名無しさん:2010/01/30(土) 17:32:43
map<string, int> hoge;
hoge.insert(make_pair("てすと", 10));

map<int, string> hoge;
hoge.insert(make_pair(10, "てすと"));

VS2008で上のがコンパイルできて、下のが出来ない理由って何なんでしょ?
202デフォルトの名無しさん:2010/01/30(土) 17:43:45
DIRECT法(DIviding RECTngle)のプログラムを組むことになったのですが、
どうにもとっかかりが無くて困っています。
おおよその理論は分かっているのですが、形にすることが全くできません。
ググって見たりはしたものの、それらしきプログラムソースもみつけることができませんでした。
助けてください。
因みに、C++で組みます。
203デフォルトの名無しさん:2010/01/30(土) 17:44:13
コンパイルできるけど?
204デフォルトの名無しさん:2010/01/30(土) 18:06:39
>>198
なぜ?
baseクラスをdrivedが継承している時、drivedインスタンスのアドレスがbase*に入っていれば
そのポインタからbase内のdrivedでオーバーライドされた仮想関数を解決する時にオーバーヘッドが発生するのでは?
逆にポインタや参照からではなくインスタンスを直接叩けば仮想関数テーブルの解決なんてしなくても
drivedインスタンスはdrivedインスタンスでしかないしdrivedを継承した更に別のクラスのインスタンスである可能性もない。
205デフォルトの名無しさん:2010/01/30(土) 18:24:23
>>201
両方を1つずつ試したけど、エラーは起きなかったよ。
エラーになる要因も見あたらないし。
206デフォルトの名無しさん:2010/01/30(土) 18:29:08
>>204
英語で検索すればmatlabのソースコードが入ったPDFとか引っかかったよ
そのアルゴリズムは今さっきしったけど暇だったから
コンパイルは通らない超適当な疑似コードを書いた

struct center{
int x,y; //2次元の場合。N次元ならどうデータを持つかはパス
int delta; //探索する幅(毎回1/3になる)
};
struct evector{ int x,y;}; //単位ベクトル
vector<evector> make_evector(int dimension); //次元の数だけ単位ベクトルを生成(略)
//中心と単位ベクトルを与えて次の中心点を計算
int update(center& d,vector<evector>& vx){
double min_value;
double eps=0;
double val=f(center);
for(/*2^(単位ベクトル数)分ループ、2次元なら4方向)*/){
if(min_value>f(center+単位ベクトル)){
min_value=f(center);
//この時のベクトル,仮にvxを保存
}
}
//保存したのベクトルの方向へ中心を移動
center.x+=(1/3)*vx.x;
center.y+=(1/3)*vy.y;
eps=f(center)-val;
return eps;
}
main(){/* 略 */while(0.0001>update(center,vec)){}} //1.0*10^(-4)が経験則らしい
207デフォルトの名無しさん:2010/01/30(土) 18:31:33
>>206
コンパイル通らないのに動的解決、静的解決の話ができると思ってるの?
何のつもり?
208デフォルトの名無しさん:2010/01/30(土) 18:36:58
うげ、アンカーミス。>>202宛です
そっちの話とは全然関係ないけど、コンパイル通らないコードを乗せたのは
本人がおおよその理論を分かってるからとおっしゃってるからです
209デフォルトの名無しさん:2010/01/30(土) 18:42:25
>>202 宿題スレいけよ。
210デフォルトの名無しさん:2010/01/30(土) 18:53:28
for(/*2^(単位ベクトル数)分ループ、2次元なら4方向)*/)
こりゃコンパイル通らないわな。
でも意図は伝わる。
211デフォルトの名無しさん:2010/01/30(土) 19:44:29
>203
>205
問題解決しました。<string>インクルードしてなかったw
stirngの小さな謎は残ったけど、質問とは関係ないので問題解決ってことで。
212デフォルトの名無しさん:2010/01/30(土) 20:01:47
つーかエラー読めよ
213デフォルトの名無しさん:2010/01/30(土) 21:18:51
>>204
仮想関数呼び出しについては確かにその通りだね。
でも、仮想関数テーブルの生成(オーバーライドの動的解決)
はコンストラクト時に発生するからオーバヘッドはどっちにしろ
「ある」。
214デフォルトの名無しさん:2010/01/30(土) 21:31:12
プログラミング言語C++第3版を読んでいるんですが、P466の
"多重継承を使えば、プログラム内の共通基底クラスに対する
依存を導入せずに兄弟クラスで情報を共有できる。"がわかりません。
これは何を言っているのでしょうか?
215デフォルトの名無しさん:2010/01/30(土) 21:54:58
仮想関数のコストはカスみたいなもんだから気にしなくていいよ
216デフォルトの名無しさん:2010/01/30(土) 22:15:44
C++で書かれたプログラムの中で、
「仮想関数のコストがこのプログラムの最大のボトルネックである!」
と結論づけられるほど洗練しきったプログラムを見たことがないぞ!

みなさんもそう思う・・・よな?
217デフォルトの名無しさん:2010/01/30(土) 22:43:05
>>216
まあ、forの中に書かなければ、仮想関数のコストは無視できるだろう。
218デフォルトの名無しさん:2010/01/30(土) 22:55:20
仮想関数のポリモーフィックな呼び出しを繰り返すデザインとしてタスクシステムとかがあるが
あれで仮想関数のコストがボトルネックになっているという話は聞いたことがない
こんな些細なコストを改善するよりいくらでもやることがあるだろう
219デフォルトの名無しさん:2010/01/30(土) 22:59:27
仮想関数のコストに悩むことがなくなったらC++プログラマ卒業だよ。
220デフォルトの名無しさん:2010/01/30(土) 23:05:57
> 些細なコストを改善するよりいくらでもやることがあるだろう
うむ。
そこまで突き詰めたら、あとは家に帰るか、
次のプロジェクトにさっさととりかかるべきだ。
221デフォルトの名無しさん:2010/01/30(土) 23:06:12
質問なんですがテンプレのhttp://www.bohyoh.com/CandCPP/FAQ/のprivateメンバのアクセス性で
そのクラスのメンバと"フレンド"からアクセスできる。と言ってるのにその直後
なお、クラスから派生したクラスメンバと"フレンド"からアクセスできるようにするためには、privateでなくprotectedとしなければなりません
一体フレンドはどうすればいいのかよくわかりません
222デフォルトの名無しさん:2010/01/30(土) 23:06:22
一時オブジェクト大量生産する方が
すごいインパクトあるよ

223デフォルトの名無しさん:2010/01/30(土) 23:14:29
>>221
フレンドはprivateとprotectedとpublicにアクセスできるから何もしなくてもいい。
224デフォルトの名無しさん:2010/01/30(土) 23:30:16
「friendはよく分からないうちは使うな。わかるようになったら使わなくなるけどな」ってうちのじいさんが言ってた
225デフォルトの名無しさん:2010/01/30(土) 23:31:52
>>221
友達の友達は、友達ではない
226デフォルトの名無しさん:2010/01/30(土) 23:35:36
素早い返答ありがとうございます
とりあえず今はまだ、フレンドを使うようなプログラムではないので皆さんの意見を
参考に頭の隅に入れておきます
227デフォルトの名無しさん:2010/01/30(土) 23:37:06
friendは俺はテンプレートクラス関係でよく使う。
Effective C++であったみたいなやつ。

クラス間ではほとんど使わないなぁ。
pimplくらいか?
228227:2010/01/30(土) 23:38:11
>>226
あと、お前の言い回しはちょっと失礼にあたるかも。
> 素早い返答
> 皆さんの意見を参考に頭の隅に入れて
この2つは危険だから以後気をつけるように。
どう危険かは自分で考えよう。
229デフォルトの名無しさん:2010/01/30(土) 23:45:18
friendってcppunitで使わない?
230デフォルトの名無しさん:2010/01/30(土) 23:47:38
>>229
cppunitを使わないから分からんなぁ。
cppunitって便利なのだろうか。
231デフォルトの名無しさん:2010/01/31(日) 00:19:24
>>228
改めて見ると確かにえろそうな文章ですね・・・
すいませんでした、今後注意します
232デフォルトの名無しさん:2010/01/31(日) 00:22:12
たびたびすいません
"えろそう"→"偉そう"です
申し訳ないです
233デフォルトの名無しさん:2010/01/31(日) 00:53:05
friendは出城みたいな感じで使うことがある。

boost::shared_ptrのdeleterとかには良く使うなぁ。
234デフォルトの名無しさん:2010/01/31(日) 00:58:39
deleterにどう使うん?
235デフォルトの名無しさん:2010/01/31(日) 01:16:11
こんな感じ?

class A {
public:
 static boost::shared_ptr<A> create() { return boost::shared_ptr<A>(new A, deleter()); };
private:
 ~A() {};
 struct deleter { void operator()(A* value) { delete value; }; };
 friend deleter;
};
236デフォルトの名無しさん:2010/01/31(日) 01:21:10
>>235 それ friend 要らないでしょ。
237デフォルトの名無しさん:2010/01/31(日) 01:32:41
class Foo
{
    class Bar
    {
    };

    friend Bar;
};

こういう形はときどき使いたくなる
238デフォルトの名無しさん:2010/01/31(日) 01:35:50
class Foo
{
    class Bar
    {
        friend Foo;
    };
};

逆だった
239デフォルトの名無しさん:2010/01/31(日) 02:40:31
>236 何ぃ??と思ったら修正出てるのね。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45
240デフォルトの名無しさん:2010/01/31(日) 02:55:17
>>239
ありゃ?今 CD1 ってことは C++2003 だとまだダメな( friend が要る)のか。ごめん。
241デフォルトの名無しさん:2010/01/31(日) 06:28:48
>>214
ダイアモンド継承時の仮想継承のことじゃないか?
http://www.geocities.jp/ky_webid/cpp/language/033.html
242デフォルトの名無しさん:2010/01/31(日) 13:23:18
>>241
そう言われてもう一度読み直してみたら理解できました。
ありがとうございました。
243デフォルトの名無しさん:2010/01/31(日) 13:35:04
ダイヤモンド継承はパンドラの箱って禿も言ってるしなあ

実際Java/C#/その他のいくつかのオブジェクト指向言語は
多重継承捨ててるしな

多重継承を持ってる言語は他にはEiffelとかSmalltalkとか
そんなのしかないな

Java/C#はインターフェースを使えば似たような事が出来るけど
244デフォルトの名無しさん:2010/01/31(日) 13:37:59
十年一日
245デフォルトの名無しさん:2010/01/31(日) 13:50:07
多重継承はなければないで困ったことはないけど
これじゃないと実装が困難っていうようなコードなんてあるの?
246デフォルトの名無しさん:2010/01/31(日) 14:00:35
>>245
ごくたまーにある
D&Eを読んで見ればわかる

それとデモンストレーションにiostreamにも使われている
247デフォルトの名無しさん:2010/01/31(日) 14:06:50
Smalltalkには多重継承はないな
248デフォルトの名無しさん:2010/01/31(日) 14:21:29
>>245
ある。
どっかで見た。
でも使ったことない。
249デフォルトの名無しさん:2010/01/31(日) 15:14:31
VS2010で
struct B { int m; };
class D1 : public B {};
class D2 : public B {};
class DD : public D1, public D2 {};
void main(){
 DD dd;
 dd.B::m = 1;
}
したら dd.D1::B::m が 1 で、dd.D2::B::m が不定値のままだった。
GCC3.4.3ではあいまいだよって言われてコンパイルできなかった。
GCCの動作が正しいんだよね?
250デフォルトの名無しさん:2010/01/31(日) 15:17:38
vcのがおかしい
251デフォルトの名無しさん:2010/01/31(日) 15:18:57
s/GCC3.4.3/GCC4.3.4/
252デフォルトの名無しさん:2010/01/31(日) 15:19:58
なんだよgccが古いからcodepadで確認しちゃったじゃないかよ
253デフォルトの名無しさん:2010/01/31(日) 15:20:15
>> 250
だよね
254デフォルトの名無しさん:2010/01/31(日) 15:21:12
>>252
失礼
255デフォルトの名無しさん:2010/01/31(日) 15:30:08
>>249
それ既知のバグだよ
M$は直す気がないらしい
なぜならATLをそのバグに依存して書いてしまってあるからだと
256デフォルトの名無しさん:2010/01/31(日) 15:31:41
>>255
MSってクソだな。
257デフォルトの名無しさん:2010/01/31(日) 15:33:21
コード1 : ttp://codepad.org/92VnkX7S
このように、MyStringクラスにはoperator+=を使ってoperator+を実装しています。
ただしoperator+はfriend関数として宣言して使いたいと思います(変えられない前提)。

ところが、よくよく考えると
friend MyString operator+(const MyString& lhs,〜
MyString temp = lhs;
って無駄ですよね?ならいっそ
friend MyString operator+(MyString lhs,〜
lhs += rhs;
の方が効率は上がるのでしょうか?

すなわち
コード2 : ttp://codepad.org/JAkODbn0
の方が効率はいいのでしょうか?
Effective C++ 日本語 3rd edn 11項のp53には
そう思えるような記述が記述があるのですが、
実際どうなんでしょう?

可読性的にはコード1の方が良いとは思うのですが、
もしコード2の方が効率はいいのでしたらそっちにしようかなぁと。


よろしくお願いします。
258デフォルトの名無しさん:2010/01/31(日) 15:38:03
>>256
いやいや物は考えよう
MSDNのどっかにバグについて書いてあったと思う
失念してしまったが
バグを正式に認めているんだから、それを避けて書けば
いいだけの話だし
259デフォルトの名無しさん:2010/01/31(日) 15:44:25
>>256
そうでもないよ。
言語拡張切れば普通にエラー出るはず。
ATLと同時に使う場合も単にコンパイル単位分ければいいだけ。
260デフォルトの名無しさん:2010/01/31(日) 15:44:55
>>258
認めたバグは許されるのか?
そんな楽な仕事俺もやりたいよ!

そんなんいちいち認めていったら、
独自言語が完成するじゃないか。
261デフォルトの名無しさん:2010/01/31(日) 15:45:03
>>255,258
えー
でも、そ知らぬ顔して優しくMSにバグレポートしてあげました。
262デフォルトの名無しさん:2010/01/31(日) 15:45:40
>>257 効率は実測が基本。
263デフォルトの名無しさん:2010/01/31(日) 15:46:25
>>262
理論の話を言いたいんだろjk

実測は最終手段。
264デフォルトの名無しさん:2010/01/31(日) 15:48:22
実測厨は無視しろ
265デフォルトの名無しさん:2010/01/31(日) 15:50:46
>>259
言語拡張オフ(/Zaオプションつける)にしてもかわんなかったYO!
266デフォルトの名無しさん:2010/01/31(日) 15:53:18
>>263
> 実測は最終手段。
はぁ?
どうせ最後には実測が必要なんだから、最初にやりゃいいんだよ。
それとも、想像で入れた高速化を効果の確認もせずにコミットするつもりなのか?
267デフォルトの名無しさん:2010/01/31(日) 15:56:39
>>263
> の方が効率は上がるのでしょうか?
...
> もしコード2の方が効率はいいのでしたらそっちにしようかなぁと。

理論なんて聞かれてませんが。
268デフォルトの名無しさん:2010/01/31(日) 16:00:38
せっかくなんで、バグレポURL張っときます。
ttps://connect.microsoft.com/VisualStudioJapan/feedback/details/529603/
今後のMSの動きにご期待ください!
269デフォルトの名無しさん:2010/01/31(日) 16:11:00
>>263
>>264
それではコード1とコード2、
どちらが効率いいのでしょうか?
270デフォルトの名無しさん:2010/01/31(日) 16:17:02
どっちもコピーされてるから一緒だろ
271デフォルトの名無しさん:2010/01/31(日) 16:19:38
俺バグレポしたことあるけど、英語で「善処します^^」ってだけ書かれて
特に対策とか今後の具体的な方針とかなしに終わった。
272202:2010/01/31(日) 19:53:42
遅くなりましたが、ありがとうございました!
参考に頑張ってみます。
273デフォルトの名無しさん:2010/01/31(日) 20:13:29
>>247
>Smalltalkには多重継承はないな

最近はTraitsってのがあるんですよ。デフォで採用しているのはSqueakだけですが。
http://scg.unibe.ch/research/traits
274デフォルトの名無しさん:2010/02/01(月) 09:01:19
自作アロケータを作っているんですがsizeof(type[array_size])とsizeof(type) * array_sizeは同じになる事が保証されていますか?
275デフォルトの名無しさん:2010/02/01(月) 09:08:09
>>274 うん。
276デフォルトの名無しさん:2010/02/01(月) 09:31:44
適当な事言わないでください今規格調べたら保証されてないと出ましたよ
277デフォルトの名無しさん:2010/02/01(月) 09:37:22
あ、そう。それ何の規格?
278デフォルトの名無しさん:2010/02/01(月) 10:16:20
>>274
保障されてないよ。
たとえば、こんなときとか!(まぁ質問したいことと関係ない気もするけどw)
#include<iostream>
int main(){
    int type[10];
    int array_size=1;
    std::cout << sizeof(type[array_size])  << std::endl;
    std::cout << sizeof(type) * array_size << std::endl;
}
279デフォルトの名無しさん:2010/02/01(月) 10:22:33
>>278
ありがとうございます!
とても参考になる意見でした!

>>275
消えろカス
280デフォルトの名無しさん:2010/02/01(月) 10:23:33
>>185
かたよってるなあ
281デフォルトの名無しさん:2010/02/01(月) 10:35:05
>>275
消えろヴォケ
282デフォルトの名無しさん:2010/02/01(月) 11:12:18
>>275
愛してる
283202:2010/02/01(月) 12:49:14
>>206さんの書いてくれたものを参考にしてみましたが、全体的にうまくいきません。
どなたか助けてもらえませんでしょうか?
このような聞き方は良くないと思いますがどうかよろしくお願いします。

参考URL: (ttp://mikilab.doshisha.ac.jp/dia/research/report/2008/1118/002/report20081118002.html)
284デフォルトの名無しさん:2010/02/01(月) 12:56:43
実際に上手くいかなかったそのソースコードを出せば誰かが診てくれるかもしれない
285デフォルトの名無しさん:2010/02/01(月) 13:05:29
shared_ptrのソースコードでこんな箇所があるんですが
このコンストラクタの引数の型って何なんでしょうか
参照の参照?ではないですよね
shared_ptr( shared_ptr && r ): px( r.px ), pn() // never throws
{
pn.swap( r.pn );
r.px = 0;
}
286デフォルトの名無しさん:2010/02/01(月) 13:22:42
右辺値参照でぐぐると幸せ
287202:2010/02/01(月) 13:37:52
>>284
まったくと言っていいほどいじれていませんが…
#include <iostream>
#include <vector.h>
struct center{
double x,y; //2次元の場合。N次元ならどうデータを持つか
int delta; //探索する幅(1/3) };
struct evector{ double vx,vy;};//単位ベクトル
struct vector<evector> make_evector(int dimension);//次元の数だけ単位ベクトルを生成
//中心と単位ベクトルを与えて次の中心点を計算
int update(center& delta,vector<evector>& vx){
double min_value;
double eps=0;
double val=f(center);
for(/*2^(単位ベクトル数)分ループ、2次元なら4方向)*/){
if(min_value>f(center+evector)){
min_value=f(center);
//この時のベクトル,仮にvxを保存
}
}
//保存したのベクトルの方向へ中心を移動
center.x+=(1/3)*vx.x;
center.y+=(1/3)*vy.y;
eps=f(center)-val;
return eps;
}
int main(){/* 保留 * /while(0.0001>update(center,vec)){}} //1.0*10^(-4)が経験則
288デフォルトの名無しさん:2010/02/01(月) 13:42:21
>>286
なるほど、C++xxで導入される機能なわけですか
右辺値参照と左辺値参照の型が異なるってことは
実用的なクラスを書くために
書かないといけないオーバーロードが増えるってことですね

ある程度C++が使える人はいいけど
新規にC++の世界に入る人のことを思うと
なんかこう、ぞわぞわします
289デフォルトの名無しさん:2010/02/01(月) 13:52:14
右辺値参照面白いな
これだと一時オブジェクトを作らなければならない場合が減るので
今まで無駄なコピーが必要だったクラスの四則演算などが効率化
されそう
290デフォルトの名無しさん:2010/02/01(月) 14:07:25
>>287
まさか /*保留*/ とか for(/* 〜 */) なんてのが、そのままで動くと思っていたのか
まずC言語を勉強しよう
291202:2010/02/01(月) 14:12:33
さすがにそれはないです。
そこの部分も含めてどうすればよいのか教えて下さると助かります。
292デフォルトの名無しさん:2010/02/01(月) 14:33:19
(´A`;)
293デフォルトの名無しさん:2010/02/01(月) 14:36:02
お断りします
   ハハ
   (゚ω゚)
  /  \
((⊂ )  ノ\つ))
   (_⌒ヽ
   丶 ヘ |
εニ三 ノノ J

せめてこっちへ池
http://pc12.2ch.net/test/read.cgi/tech/1263824755
294デフォルトの名無しさん:2010/02/01(月) 14:38:58
右辺値参照は効率がいいのは分かるが、最初使い方がちょっと分からんかった
295202:2010/02/01(月) 14:39:59
わかりました。

ありがとうございました。
296デフォルトの名無しさん:2010/02/01(月) 14:44:47
>>294
使える場合も結構限られてるしな
297デフォルトの名無しさん:2010/02/01(月) 15:08:25
ライブラリが高速になるのと、ラムダのため以外に使い道がいまいち思い浮かばないな
298デフォルトの名無しさん:2010/02/01(月) 16:15:36
visual c2008のデバッグで、vectorの添え字範囲外が
おこった場所特定する方法無い?
エラー箇所がわかるんだけど、STLのソースが出てくる。
その前の自作コードの位置=呼び出し先がわかりたい。
エニー箇所ではなく[]を使ったところ。
299デフォルトの名無しさん:2010/02/01(月) 16:18:52
vectorの操作している直後に、printfで連番打って
出力みながら確認するっていう方法取っていたんだが
ソースに挟み込む、取り除くのが一苦労
間違って余分消したりすると、余計なエラーも発生する可能性あるし。
300デフォルトの名無しさん:2010/02/01(月) 16:26:08
#ifdef _DEBUG
301デフォルトの名無しさん:2010/02/01(月) 16:28:19
printfを組み込んだ状態を常にするって事ですか。
デバッグでもprintfが不要になる場合もあるんです。
速度低下して先に進めなくなるので。
[]の呼び出し元だけ特定できればいいのですが。
302デフォルトの名無しさん:2010/02/01(月) 16:32:12
>>298
at()に変えてコンパイル
例外が出る
303デフォルトの名無しさん:2010/02/01(月) 16:33:49
>>301
#ifdef _DEBUG
304デフォルトの名無しさん:2010/02/01(月) 16:39:48
なんで呼び出し履歴を見ないのだろう……
ということで、ツールの使い方はスレ違いにつきVCスレへどうぞ。
305デフォルトの名無しさん:2010/02/01(月) 16:41:13
printf は素のままじゃなくて
マクロ経由でつかいましょ
306デフォルトの名無しさん:2010/02/01(月) 16:52:33
サンクス
呼び出し履歴みてみます
307デフォルトの名無しさん:2010/02/01(月) 17:59:45
久しぶりにカナ変換使っている人を見た
308デフォルトの名無しさん:2010/02/01(月) 19:54:51
>エニー箇所ではなく[]を使ったところ。

これか。

o = ら
i(oの隣) = に

ほんとだー
309デフォルトの名無しさん:2010/02/01(月) 20:08:38
>>299
開発中のソースツリーはそのままでこれをコピーしてそれにprintf()を
組み込んでデバッグするとデバッグコードを取り除くかわりに
コピーを削除するだけでいいよ。
310デフォルトの名無しさん:2010/02/01(月) 22:51:51
pthreadのIDから、スレッド生存を調べられますか?
webで検索したけど見つからないです。
311257:2010/02/01(月) 23:28:02
1 ttp://codepad.org/mFAHo8Y3
2 ttp://codepad.org/8o6YwVQM
これでアセンブラコードを出力させてみましたところ、
どちらも違うコードとなりました。
(VC++, g++, bccで最適化有効にして確認。)

そのアセンブラファイルサイズは
g++, bccでは2のコードが1より小さく
VC++では1のコードが2より小さく
なりました。

意味的には同じだと思うのですが、
どうして違うasmに帰着してしまうのでしょうか?

312デフォルトの名無しさん:2010/02/02(火) 00:46:26
逆にどうして同じになると思ったのか
最適化なんてそれこそコンパイラの癖や気分が最も出やすい所で
別の組織で別々に開発されたコンパイラの最適化の結果が同じになる方がおかしい
313デフォルトの名無しさん:2010/02/02(火) 00:58:38
最適化といっても実際のところ 「最適」 になるわけではないからな
最適なコードが得られるまで延々と時間をかけるわけにはいかないので
現実的なコンパイル時間内でなるべくより良いコードを生成するっていうくらいだ
314デフォルトの名無しさん:2010/02/02(火) 01:05:23
むしろ最適化しなくても、同じになるなんて一切仮定できない
C/C++での表現がどんなアセンブラコードに当たるかなんて解釈次第
googleの翻訳とexciteの翻訳で同じ英文が出てこないと言ってるのと一緒

>>311はよくわかってなさそうだから付け加えておくと
小さいコードが速いコードとは限らないからね
315デフォルトの名無しさん:2010/02/02(火) 07:26:14
>>312
> 別の組織で別々に開発されたコンパイラの最適化の結果が同じになる方がおかしい
そういう意味ではありません。


>>313-314
そうですか。ありがとうございます。
316デフォルトの名無しさん:2010/02/02(火) 13:56:07
> そういう意味ではありません。
そういう意味じゃん。
317デフォルトの名無しさん:2010/02/02(火) 16:17:37
ほっとけよ

頭悪そうじゃんコイツ
318デフォルトの名無しさん:2010/02/02(火) 16:35:57
「頭が悪そう」ではなく、どこがそう思うに足りるほどの矛盾点を抱えているのか説明していただけませんか?
319デフォルトの名無しさん:2010/02/02(火) 16:37:11
自分でそれがわかってないところ、かな
320デフォルトの名無しさん:2010/02/02(火) 16:53:22
他人を頭が悪いと言う人は自分の頭は良いと思っているんでしょうね?
321デフォルトの名無しさん:2010/02/02(火) 16:56:49
少なくともそいつよりはいいと思ってるでしょう
322デフォルトの名無しさん:2010/02/02(火) 17:05:06
頭の悪い人はしばしば>>320みたいな馬鹿な切り返しをするね。
言うまでもなく、xが「頭が悪い人」なら自称非xは「自称頭が悪くない人」であり、
そこには頭が良い人だけでなく、この世の大多数を占める凡人も含まれる。
だから確率的にいって、この凡人の立場から言ってるのだろうと考えるのが普通だけど、
頭の悪い人がのぼせると、頭が悪い人と良い人の2種類しか想定しない>>320の切り返しが炸裂する。
323デフォルトの名無しさん:2010/02/02(火) 17:17:11
自分の頭が良いのか悪いのか、わかっていない人がゴロゴロいますね。
324デフォルトの名無しさん:2010/02/02(火) 17:19:25
という「自分だけは色々わかってるつもりの第三者」も登場したりします。
325デフォルトの名無しさん:2010/02/02(火) 17:21:44
自虐ですね、あなた。
326デフォルトの名無しさん:2010/02/02(火) 17:22:55
結局317が正解だったな
327デフォルトの名無しさん:2010/02/02(火) 17:26:07
「彼は何も知らないのに、何かを知っていると信じており、これに反して私は、何も知りもしないが、知っているとも思っていない」byアリストテレス
328デフォルトの名無しさん:2010/02/02(火) 17:27:01
だから引数が結局コピーされて+=されて返却されるという
まったく同じ意味のコードが違うコードを生成するという
単純な驚きじゃないですか?
329デフォルトの名無しさん:2010/02/02(火) 17:35:42
>>327
微妙にズレた引用がお約束で良い感じです。
330デフォルトの名無しさん:2010/02/02(火) 17:56:47
クソ、何だこの言葉遊びな流れは。
殺伐とするならもっと殺伐としろよ、できないならいつもの流れに戻れ。
クズ共が。
331デフォルトの名無しさん:2010/02/02(火) 18:03:28
トラウマをプレゼントしようにも何を指摘されてるのか理解する資質にさえ欠けてる感じ
332デフォルトの名無しさん:2010/02/02(火) 18:56:12
総じて「理屈っぽい奴」は理屈っぽいだけで論点が全く的を射ていない
だから馬鹿
333311:2010/02/02(火) 19:37:49
>>312
バカにも分かりやすく解説しますと
> 1 ttp://codepad.org/mFAHo8Y3
> 2 ttp://codepad.org/8o6YwVQM
> 「どちらも」
->比較対象は2つ
これ以外のところからも比較対象は2つであることがわかる。
> g++, bccでは2のコードが1より小さく
> VC++では1のコードが2より小さく
> なりました。

一方バカな>>312は以下の様な恥ずかしいカンチガイをさらけだしてくれた。
> 別の組織で別々に開発されたコンパイラの最適化の結果が同じになる方がおかしい
そんなこと誰も言ってないのに。
いったい誰に反論しているのだろうか?

どう?分かった?無知な>>312さんwww
334デフォルトの名無しさん:2010/02/02(火) 19:49:37
ヘッダとソースのどちらにも#includeって書くことはダメらしいけど、
ヘッダにだけ#includeって書けばいいの?
335デフォルトの名無しさん:2010/02/02(火) 19:50:20
>>334
そんなことないよ。
宣言は何回あってもいいんだよ。
336デフォルトの名無しさん:2010/02/02(火) 19:54:46
何回あってもいくない宣言もあるけど、
ふつうはインクルードガードされてるから大丈夫
337デフォルトの名無しさん:2010/02/02(火) 19:54:53
>>334
C言語編 第60章 インクルードガード
ttp://www.geocities.jp/ky_webid/c/060.html
インクルードガード
ttp://www.02.246.ne.jp/~torutk/cxx/file/includeguard.html
とりあえずこの2つを熟読してみ。
それでもし疑問点が何か残るなら、また聞いてごらん。

・・・あ、もしかしてインクルードガードを理解してないわけじゃないなら
宣言と定義
ttp://www-jlc.kek.jp/~fujiik/C++/declare.html
こっちの方がいいかもね。
338デフォルトの名無しさん:2010/02/02(火) 19:56:04
>>336
ちなみに
>何回あってもいくない宣言
ってなんですか?
339デフォルトの名無しさん:2010/02/02(火) 20:12:13
enumとか
typedefはいいんだっけ・・?
340デフォルトの名無しさん:2010/02/02(火) 20:24:37
>>339
宣言じゃないのでは?
341デフォルトの名無しさん:2010/02/02(火) 20:25:44
externはどうだっけか?
342デフォルトの名無しさん:2010/02/02(火) 20:28:38
>>333
>意味的には同じだと思うのですが、
>どうして違うasmに帰着してしまうのでしょうか?

こんな馬鹿なこと聞いてたから、「意味的に同じコードは(どんなコンパイラでも)同じasmに帰着する」みたいな
どうしようもない絶望的な勘違いをしてるんじゃないかと思っただけ
そうじゃないならいいよ
別のひどい勘違いはしてたみたいだが
343デフォルトの名無しさん:2010/02/02(火) 20:34:48
いいよ・・・てwww

          ____
       / \  /\ キリッ
.     / (ー)  (ー)\    <「>>342そうじゃないならいいよ」
    /   ⌒(__人__)⌒ \
    |      |r┬-|    |
     \     `ー’´   /
    ノ            \
  /´               ヽ
 |    l              \
 ヽ    -一””””~~``’ー?、   -一”””’ー-、.
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))

          ____
        /_ノ  ヽ、_\
 ミ ミ ミ  o゚((●)) ((●))゚o      ミ ミ ミ   <だっておwww
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\   /⌒)⌒)⌒)
| / / /     |r┬-|    | (⌒)/ / / // 
| :::::::::::(⌒)    | |  |   /  ゝ  :::::::::::/ 
|     ノ     | |  |   \  /  )  /
ヽ    /     `ー’´      ヽ /    /
 |    |   l||l 从人 l||l      l||l 从人 l||l  バンバン
 ヽ    -一””””~~``’ー?、   -一”””’ー-、
  ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
344デフォルトの名無しさん:2010/02/02(火) 20:41:01
この板でそんなAA貼るなよ
345334:2010/02/02(火) 20:49:28
>>335-337
ありがとうございます

ヘッダーで#includeしてもいいんだけど、
他のヘッダーとの間で名前が衝突してしまうってだけの話でおk?
あと、コンパイル速度が遅くなる程度
346デフォルトの名無しさん:2010/02/02(火) 20:51:01
俺のことを笑うのは勝手だがスレを荒らすなよ
迷惑だろ
347デフォルトの名無しさん:2010/02/02(火) 20:52:16
ヘッダの中で使う場合はヘッダで
ソースでしか使わない場合はソースで
348デフォルトの名無しさん:2010/02/02(火) 21:02:19
>>344
貼らずにいられなかったんでしょ、悔しくて。
349デフォルトの名無しさん:2010/02/02(火) 21:14:55
>>347
thx
350デフォルトの名無しさん:2010/02/02(火) 21:21:46
>>345
外してるかもしれないけど、
名前の衝突ってのが「複数回定義されているシンボルが・・」や
「再定義されました」みたいなエラーのことをさすなら
宣言と定義をごっちゃにしてるんだと思う

a.h
#pragma once //あるいはよくある#ifndef A_H_ ...
#include main.h //a.hでmain.hをインクルードした

a.cpp
#include "a.h"

main.h
#pragma once
int global_a;

main.cpp
#include "main.h"


ヘッダファイル(main.h)では宣言ではなく定義がなされているので
main.objとa.objの両方でglobal_aの実態が作られてしまうため
インクルードガードがあってもくエラーになる
定義じゃなくて宣言なら問題ない
たとえばextern int global_a;
351デフォルトの名無しさん:2010/02/02(火) 21:23:16
もっとシンプルにかけばこう
a.cpp
#include "main.h"

main.cpp
#include "main.h"

main.h
#pragma once
int global_a;
352デフォルトの名無しさん:2010/02/02(火) 21:49:41
using namespaceの挙動を教えてー
353デフォルトの名無しさん:2010/02/02(火) 21:58:24
>>348
あんまり可笑しいもんで、嗤っちゃっただけだww
354デフォルトの名無しさん:2010/02/02(火) 22:04:08
いいなぁその説得力ゼロの
僕はとっても冷静ですポーズ。
355デフォルトの名無しさん:2010/02/02(火) 22:06:09
>>353
お前消えろカス

>>354
お前も消えろカス
356デフォルトの名無しさん:2010/02/02(火) 22:08:43
>>354
お前に聞きたい。
お前も可笑しいとは思わないか?


だって>>333はバカがカンチガイしないように2つも
安全ネットを張ってあげてたんだぜ?
そして その2つの安全ネットをぶち破るバカが存在したんだぞ?

お前も可笑しいとは思わないか?
357デフォルトの名無しさん:2010/02/02(火) 22:23:44
>>333って、文章が下手糞なのと、興奮しすぎて脳内設定先走りすぎなのの2点で、
本人にしか効能のわからない典型的な電波レスになってるよね。
358デフォルトの名無しさん:2010/02/02(火) 22:29:07
その安全ネットをぶち破ってるのが他ならぬ311の最後の2行だろうよ
あんなの書かれたら質問者は根本的な勘違いをしてると思うもんだ
359デフォルトの名無しさん:2010/02/02(火) 22:34:33
>>357
何?>357のレスは自己再帰的なの?
360デフォルトの名無しさん:2010/02/02(火) 22:36:31
各CPPでstaticなクラスを宣言した時、基本的にコンストラクタ呼出順は
制御できないと思いますが、

Test::Test() : Value(1)
{
};

このValue(1)もコンストラクタ呼出順に影響するんでしょうか?
ついでにこれの呼び方を教えてほしいです。
361デフォルトの名無しさん:2010/02/02(火) 22:40:37
>>358
バカなお前はもう一度同じ事言われたいの?
362デフォルトの名無しさん:2010/02/02(火) 22:46:55
>>360
コンストラクタ呼び出し順ってなに?
Value(1)みたいなのは初期化リストっていって
そこに書いた順序ではなく
クラスのメンバとして宣言した順序で初期化されることが決まってる
363デフォルトの名無しさん:2010/02/02(火) 22:52:25
>>360
「staticなクラスを宣言」というのが掴みづらいんだけど、全体から推測するに、
cppファイルの関数外の場所で、static Test test; みたいにインスタンスを生成する時の話がしたいのかな?

その例のValue(1)は、TestクラスのValueというメンバ変数を初期化している。
呼び方は、とりあえず「メンバ変数の初期化」って呼んでおけば誤解は無いはず。
メンバ変数の初期化は、キミが訊きたい(のであろう)コンストラクタ呼出順の話とは関係ないよ。
364デフォルトの名無しさん:2010/02/02(火) 22:53:22
いったい俺は何番から何番をあぼんすればいいんだ
>>359
>>361
>>357
>>358
>>356
>>355
>>354
>>353
365デフォルトの名無しさん:2010/02/02(火) 22:55:50
クソみたいな勘違いしてたくせに偉そうな奴も
そいつにいつまでも構うクソみたいな奴も黙れ
366デフォルトの名無しさん:2010/02/02(火) 22:57:42
>>365
レスする=その話題が伸びることを支持し、火に薪をくべる
レスしない=その話題が伸びないことを支持し、火の勢いに一切手を貸さず鎮火を願う

お前は根本的に分裂している
367デフォルトの名無しさん:2010/02/02(火) 22:58:08
>>365
そいつらにかまうお前は黙らなくていいのか。
あと、そういうことを書くなら安価しろ

368デフォルトの名無しさん:2010/02/02(火) 22:58:37
>>361
あんたが天才なことはよくわかったから
今後は自分をバカに見せるような質問の書き方はしないようにしようぜ
369デフォルトの名無しさん:2010/02/02(火) 22:59:24
>>257から始まり>>368まで、
大人気だなw
370デフォルトの名無しさん:2010/02/02(火) 23:00:39
> クソみたいな勘違いしてたくせに偉そうな奴
> そいつにいつまでも構うクソみたいな奴
これって、どうも複数人vs複数人に見えるのは俺だけだろうか?
両陣営ともなんか一人じゃない用な気がする。

ってどうでもいいレスをしてみるテスト
371デフォルトの名無しさん:2010/02/02(火) 23:01:43
案外>>257はとっくに居なくなってたりしてな。
372デフォルトの名無しさん:2010/02/02(火) 23:02:02
ディンの村に幼獣スルーカが現れた
373デフォルトの名無しさん:2010/02/02(火) 23:02:30
バカは黙って天才の言葉に従えばいいんですよw
374デフォルトの名無しさん:2010/02/02(火) 23:08:15
>>370
言いたいこと言って、テスト付けて精神的に逃げるのはタチ悪いぜ。
375デフォルトの名無しさん:2010/02/02(火) 23:16:11
なんともカオスなスレ
376デフォルトの名無しさん:2010/02/03(水) 00:39:09
脊髄反射的にAAを貼っちゃうお子様が居ついたことは確かだわな
377デフォルトの名無しさん:2010/02/03(水) 07:24:59
>>376
稚拙なレスですね。
これから小学校ですか?
378デフォルトの名無しさん:2010/02/03(水) 10:46:43
try {
 「釣り針」ブロック
}
catch() {
 「私でも釣れた!」ブロック
}
finally {
 「水中に引き込まれて溺れる」ブロック
}
379デフォルトの名無しさん:2010/02/03(水) 10:54:47
必ず溺れるのか・・・
380デフォルトの名無しさん:2010/02/03(水) 10:58:10
finallyなんてないよ
381デフォルトの名無しさん:2010/02/03(水) 11:23:26
struct A{
B *b_;
SetB(B *b);{b_=b;}
};

struct B{
A a;
B(){ a.SetB( this ); }
};

こういう、コンポジションされる側とする側の依存って一般的?
こういうことしたいってなった時点で設計ミスを疑うべき?
382デフォルトの名無しさん:2010/02/03(水) 11:56:33
あまり良い設計じゃないと思う
片方必要とされる側は必要とする側に関知しないように作れば
そちら側は再利用できるのに
383デフォルトの名無しさん:2010/02/03(水) 12:12:04
そういうデザインパターンは普通にあるよ
そういううののタメにweak_ptrとかあるわけだし
384デフォルトの名無しさん:2010/02/03(水) 13:41:18
> そういうデザインパターンは普通にあるよ

GoFのデザパタで?
385381:2010/02/03(水) 13:42:38
weak_ptrがどういうものなのかよく解らん。
とりあえず後で調べるから、悪いけど>>383すまん。

上記みたいな設計になっちゃった場合、
A <-> C <-> B
こんな感じで間に第三者を挟めばいいのか?
スレチですまん
386デフォルトの名無しさん:2010/02/03(水) 15:56:41
Javaでの
Double.isNaN(d)
Double.isInfinite(d)
にあたるものはC++では何でしょうか
#infや#indだと検索しにくくて困ってます
387デフォルトの名無しさん:2010/02/03(水) 16:35:19
処理系依存しか無いよ
388デフォルトの名無しさん:2010/02/03(水) 16:49:18
こんなんでどう
bool isNaN(double d) { return d != d; }
bool isInfinite(double d) { return d < DBL_MIN || d > DBL_MAX; }
移植性?
(゚听)シラネ
389デフォルトの名無しさん:2010/02/03(水) 16:55:18
移植性考えないんだったらtype_traits作ってビットチェックもしてメタ関数も作れよ無責任だな。
390デフォルトの名無しさん:2010/02/03(水) 18:46:00
stlの numeric_limits とかに定義されてないかな?
391デフォルトの名無しさん:2010/02/03(水) 20:24:57
>>386
std::numeric_limitsに定義されています。
21.3 numeric_limit メンバー
ttp://docs.sun.com/source/820-2985/general/21_3.htm
numeric_limits - C++ Reference
ttp://www.cplusplus.com/reference/std/limits/numeric_limits/
392デフォルトの名無しさん:2010/02/03(水) 20:45:47
んー、ざっと見たけど>>386相当のものはないような
has_infinityは型(doubleとか)が∞を表現として持つかのbool値だし
infinity()
quiet_NaN()
は値としての#INFなどの表現を直接得るものだし

結局処理系依存の
#include <float.h>
_isnan( val )
_finite( val )

gcc
#include <math.h>
int isnan(x);
int isinf(x);

これらを使うしかないんじゃ
393デフォルトの名無しさん:2010/02/03(水) 21:09:31
<math.h>のisnan, isinfあたりは処理系依存じゃなくて
既にC99で規格化されてるものなんで、
C++0xで正式に入ることことも決まってるし使っちゃっておkじゃね
394デフォルトの名無しさん:2010/02/03(水) 21:13:30
ほかには、boost/math/special_functions/fpclassify.hppにもisnanとかisfiniteがある。
将来的には、C++0xで定義される見込み。C99ではすでに存在するんだけど……。
395391:2010/02/03(水) 21:23:13
>>392
> has_infinityは型(doubleとか)が∞を表現として持つかのbool値だし
これがfalseなら
Double.isNaN(d)
Double.isInfinite(d)
もfalseを返せばいいってことでしょ?
そんでtrueなら
> infinity()
> quiet_NaN()
は値として比較すりゃいいじゃん。
例:
bool isInfinite(double d) : d==std::numeric_limits<double>::infinity()ならtrueを返す。そうでないならfalse。
bool isInfinite(double d) : d!=std::numeric_limits<double>::quiet_NaN()ならtrueを返す。そうでないならfalse。
396デフォルトの名無しさん:2010/02/03(水) 22:14:16
NaNを値で比較しても常にfalseにならないべか
397391:2010/02/03(水) 23:45:27
>>396
色々と間違えた

bool isInfinite(double d) : d==std::numeric_limits<double>::infinity()ならtrueを返す。そうでないならfalse。
bool isNaN(double d) : d!=dならtrueを返す。そうでないならfalse。
でおkね。
398デフォルトの名無しさん:2010/02/03(水) 23:53:14
慌ててNaNを調べたのがばればれだな
399デフォルトの名無しさん:2010/02/04(木) 01:34:02
コンポートネントプログラミング
400デフォルトの名無しさん:2010/02/04(木) 10:56:03
負の無限大は・・・
401デフォルトの名無しさん:2010/02/04(木) 19:11:24
>>398
しらねぇわけねえだろバカwww

幼稚園児じゃあるまいし
なあ?>>395よw
402デフォルトの名無しさん:2010/02/04(木) 20:09:05
NaNがなんなのか調べた。
403デフォルトの名無しさん:2010/02/04(木) 20:11:23
Noudarake and Nounashi
404デフォルトの名無しさん:2010/02/04(木) 20:17:57
>>401
バブー?
405デフォルトの名無しさん:2010/02/04(木) 20:30:07
知らない領分を無理して答えるもんじゃあないな
406デフォルトの名無しさん:2010/02/04(木) 20:43:15
NaNにおける演算結果の意味を考えると
0/0や±∞/±∞、0・±∞などがある。
これらが“数ではない”ものとして扱われるそもそもの理由とは
離散数学における数という概念が「量ではなく任意の長さの単位の倍数」という
古代ギリシャで起こった極めて初歩的な概念を継承している部分にあり、
上述した演算が定義されない事に因む。
更に物理学の要請から解析学が生まれ、解析学は演算対象の任意の有限区間の非加算濃度を要求した。
これは実数体に他ならない。有理数体の稠密性は実数体の超越表現の結果である。
それを浮動小数点数と言った稠密性のある体へ表現を拡大していったときにまだこれらの量を否定する考えが存在するなどと言う事はあってはならない。
407デフォルトの名無しさん:2010/02/04(木) 20:43:25
あなたとはnamespaceが違うんです
408デフォルトの名無しさん:2010/02/04(木) 20:59:45
お前らまた荒らしたいの?
え?
なんなの?
409デフォルトの名無しさん:2010/02/04(木) 21:22:34
VCつかってるんだけど
stdcallやcdeclに比べてfastcallって呼び出しが速くなるの?

エロい人教えてー><
410デフォルトの名無しさん:2010/02/04(木) 21:38:16
C++で木構造を扱うのに便利な
知識や方法などを教えてください。
411デフォルトの名無しさん:2010/02/04(木) 21:56:02
>>410
初歩的なものからならリンクリストは必須。
現代的なものだと多相性とかかな。(boost.variant)

>>409
引数がレジスタを介してサブルーチンに渡されるから速い。
412410:2010/02/04(木) 22:48:58
>>411
ありがとうございます。
413デフォルトの名無しさん:2010/02/05(金) 01:03:25
>>409 レジスタ渡しだから引数2つ以下で効果大って聞いた
流れぶった切りですが質問です。
C++で利用できるSVG形式の読み込み〜描画ができるライブラリを探してるんですが、いいのありますか?
414デフォルトの名無しさん:2010/02/05(金) 01:24:43
mc++ 2010 販売いつごろ?
ベータ ver. ダウンロード期間中だけど
いつ頃まで c++が正常に作動するのか?
415デフォルトの名無しさん:2010/02/05(金) 01:33:37
unsigned int型をint型にキャスト(int)uint、またはその反対って問題ないんでしょうか
対象の変数は0未満にならず、上限もint型の範囲内とします。
もし推奨されないなら良い方法を教えてくれませんか。
416デフォルトの名無しさん:2010/02/05(金) 01:34:55
>>415
範囲内だと保証できるのなら問題ないよ。
417デフォルトの名無しさん:2010/02/05(金) 01:36:20
>>416
ありがとうございます!
418デフォルトの名無しさん:2010/02/05(金) 01:56:51
なんで、privateな変数はポインタだらけなの?
419デフォルトの名無しさん:2010/02/05(金) 02:05:01
気のせいだ
private以外の変数もポインタだらけだ
420デフォルトの名無しさん:2010/02/05(金) 06:55:38
関数を書くなら例外安全にしないとダメなんでしょうか。

例えば関数テンプレート
template<class T>
T foo(const T& arg){〜〜}
だと、そのテンプレート引数Tにどんな型をクライアントが入れてくるか定まらな
いため、fooを作る側の私としてもどうにも基本保証すらできません。

よろしくお願いします。
421デフォルトの名無しさん:2010/02/05(金) 07:26:32
>>420
強い保証が提供できないなら、その旨ドキュメント化しておかないと呼び出し元の
想定しない状態を作って問題を起こす可能性がある。

基本保証すら提供しないのはほとんどバグだと思われても仕方が無いレベル。
この場合は例外を発生させないための条件を事前条件としてしまったほうがマシかもしれない。
422デフォルトの名無しさん:2010/02/05(金) 09:38:48
スマポ使えばTに関係なく基本保証は簡単にできると思うけど
423420:2010/02/05(金) 14:34:30
>>421-422
ありがとうございます。

template<typename T>
class MyTemplateClass
{
    T num;
public :
    MyTemplateClass(T n = 0) : num(n) {}
    MyTemplateClass(const MyTemplateClass& other) : num(other.num) {}
    
    ~MyTemplateClass(){};
    
    MyTemplateClass& operator=(const MyTemplateClass& rhs){num=rhs.num;return *this;}
    MyTemplateClass& operator=(const T& rhs){num=rhs;return *this;}
};

例えばこんなクラステンプレートだとしますと、
Tのメンバ関数operator=が例外を投げるような代物であった場合、
MyTemplateClass::operator=(const T& rhs)
MyTemplateClass::operator=(const MyTemplateClass& rhs)
は両方ともこのままでは例外非安全ということでしょうか?


424デフォルトの名無しさん:2010/02/05(金) 15:34:43
ttp://codepad.org/wp2jk2KS
このコードの結果で、
delete前はnum1〜num6まで全て有効であり、
delete後はnum1とnum4だけが有効で、num2, num3, num6は無効(値を利用したら未定義の動作)である。
という理解で宜しいでしょうか?

codepadではこのようになるようですが、
標準C++準拠な他のコンパイラでも成り立ちますか?


よろしくお願い申し上げます。
425デフォルトの名無しさん:2010/02/05(金) 16:49:05
>>423
NO。
その場合Tが投げる例外をMyTemplateClassがcatchしたとして
一体どうしろと?
426420:2010/02/05(金) 17:30:33
>>425
No.というのはつまり両方ともこのままでは
例外非安全ということでしょうか?

いったいどうすればMyTemplateClass::operator=(〜)で
基本保証ができますでしょうか?
427デフォルトの名無しさん:2010/02/05(金) 17:33:56
クライアントがしても良い事と悪い事を指定すればいいだけ。
428デフォルトの名無しさん:2010/02/05(金) 17:44:56
ということは、

ドキュメントに
T型の変数が使っているメンバ関数を列挙し、
これらが例外を投げないとすれば
基本保証or強い保証or例外を投げません。

と書けばよいでしょうか?
429デフォルトの名無しさん:2010/02/05(金) 18:22:31
クラステンプレートの場合、
T型変数が常識的に考えて投げないだろうって
思う場合(operator=とかswapとか)は別にそこまで冗長に書かなくても
いいのでは?
自分で書いた部分でthrowしなければ
強い保証としていいんじゃないかなぁ。
430デフォルトの名無しさん:2010/02/05(金) 19:15:21
例外云々の前にYes/Noの論理を理解するべき。
431デフォルトの名無しさん:2010/02/05(金) 19:57:56
>>430
ttp://blog.livedoor.jp/kazu_fujisawa/archives/51578434.html

さて、"Yes"と"No"と「はい」と「いいえ」の違いを説明します。
「昨日、選挙に行かなかったのですか?」
と言う質問に対して、もしあなたが選挙に行っていなかったら答えは、
「はい、行きませんでした」
となります。
もし行っていたら、
「いいえ、行きましたよ」
が正しい答えです。
日本語の場合は文全体を見て、それが事実と合っているか違うかを見るのです。
ところがこれが英語だと、
"Didn't you go to the election, yesterday?"
と聞かれて、もし選挙に行っていなかったら、
"No, I didn't."
となります。
逆に行っていたら、
"Yes, I did!"
が正しい答えです。
日本語とまったく逆になるのです。
432デフォルトの名無しさん:2010/02/05(金) 20:06:19
>    MyTemplateClass& operator=(const T& rhs){num=rhs;return *this;}

コードがこれだけなら T の operator= と
MyTemplateClass の operator= の例外安全性は同じ

>例外非安全

んな言葉はありません
433420:2010/02/05(金) 20:15:46
>>429-431
ありがとうございます。

>>432
> >    MyTemplateClass& operator=(const T& rhs){num=rhs;return *this;}
> コードがこれだけなら T の operator= と
> MyTemplateClass の operator= の例外安全性は同じ
Tにクライアントが何を入れるか分からない場合、
ドキュメントになんて書けば良いことになりますか?
434デフォルトの名無しさん:2010/02/05(金) 20:29:23
>>433
Tの詳細がMyTemplateClassにとって不明なんだから例外について
MyTemplateClassのドキュメントに書く必要がある事などないんだよ。
435デフォルトの名無しさん:2010/02/05(金) 20:31:15
throw()付けて更にドキュメントに例外投げちゃダメだよ〜んって書いておけば許してくれるよ
436デフォルトの名無しさん:2010/02/05(金) 20:37:04
そもそも、C++では例外非安全なコードなどバグとか未完成品と考えるべきで
437デフォルトの名無しさん:2010/02/05(金) 20:38:55
>>436
理想論だな。現実を見ろ

じゃあ聞くけど>>423のMyTemplateClassで
お前ならどうやって例外安全を保証するの?
Tの詳細がMyTemplateClassにとって不明な状況だぞ。
438デフォルトの名無しさん:2010/02/05(金) 20:44:59
>>437
逆に聞くけど、>>423のMyTemplateClassのどこかに
例外安全じゃないところがありますか?
Tに何を与えるのかはクライアントの問題であって
MyTemplateClassには関係ないこと。
439420:2010/02/05(金) 20:47:47
>>434-438
みなさんありがとうございます。

MyTemplateClassをちゃんと(強い保証になるように)コーディングできていれば、
「強い保証です」と書いていいわけですね。

それでTがトンデモ仕様であったらそれはまた別問題ということなんですね。
440>>420:2010/02/05(金) 20:49:36
経験の豊富なみなさんにお伺いしたいのですが、

クラスの 全ての メンバ関数に対し、
「強い保証/基本保証 をします」
とドキュメントに記載していますか?
441デフォルトの名無しさん:2010/02/05(金) 20:54:36
「強い保証」とか「基本保証」って規格かなんかで定義されている言葉なの?
442デフォルトの名無しさん:2010/02/05(金) 22:33:51
基本保証はリソースをきっちり管理できてる
強い保証は「成功」か「失敗したけど、完全に失敗前の状態にもどる」のどちらかしか起こらない
443デフォルトの名無しさん:2010/02/05(金) 22:37:27
>>442
> 基本保証はリソースをきっちり管理できてる
それに加えて、オブジェクト自身が何らかの有効な状態を維持している(どの状態かは問わない)
という条件が必要じゃなかったか?
> 強い保証は「成功」か「失敗したけど、完全に失敗前の状態にもどる」のどちらかしか起こらない
それはその通りだと思う。

>>441
されていない。
でも現在のC++の常識。
例えるならgotoを使いまくっているヤツを排除しただろ?
あれと同じ発想だ。(by Effective C++より)
444デフォルトの名無しさん:2010/02/05(金) 22:42:38
EffectiveC++第3版を今開いた
2版と全然違うことがかいてあるじゃないか
まだ全然読んでないから読まんといけんな
445デフォルトの名無しさん:2010/02/05(金) 22:53:16
>>440
特に書かなければ、基本保証が前提だろう。
446420:2010/02/05(金) 23:02:19
>>445
そうなんですか。
ありがとうございます。
447443:2010/02/05(金) 23:33:18
ttp://takagi.in/modules/bwiki/index.php?%CE%E3%B3%B0%B0%C2%C1%B4

ここには
>>442> 基本保証はリソースをきっちり管理できてる
と書かれているな。
Effective C++とどっちを信用すべきなんだ!?
448デフォルトの名無しさん:2010/02/05(金) 23:44:25
どちらも盲信すべきではない
449デフォルトの名無しさん:2010/02/05(金) 23:45:01
規格で決まっていないことについて信用も何もないと思うが
450デフォルトの名無しさん:2010/02/05(金) 23:51:11
お前らは

 便所の落書き vs Scott Meyers先生

どっちが勝つと思うよ?

・・・って程度だろ。
451デフォルトの名無しさん:2010/02/05(金) 23:53:06
いざ問題が起きたときに、

「私はネットのブログだかなんだかの定義にのっとりました!」
「私はEffective C++のScott Meyers先生の定義にのっとりました!」

どっちが良いかってことか。
・・・でもバカ上司にはどっちも通用しなさそうだwww
452デフォルトの名無しさん:2010/02/06(土) 00:04:25
ところでE(ry)C++とかの内容ってC++0xでも通用するのかね
453デフォルトの名無しさん:2010/02/06(土) 00:07:08
auto_ptr使おうぜ!みたいなのは通用しなくなる
454デフォルトの名無しさん:2010/02/06(土) 00:19:14
>433
世の中にあるドキュメントを参考にすればいいと思うんだ。
http://www.boost.org/doc/libs/1_42_0/libs/smart_ptr/smart_ptr.htm
だと、Common Requirements に前提を記述した上で、Exception Safety に基本的な挙動を、各関数に例外送出時の挙動が記述してある。
http://www.boost.org/doc/libs/1_42_0/libs/circular_buffer/doc/circular_buffer.html
だと、各関数にT のどの操作の例外が外に飛んでくるかと例外安全性を記述。

後は適当に調べてくれ。
455デフォルトの名無しさん:2010/02/06(土) 02:08:26
>>440
強い例外保証が提供できていればぶっちゃけドキュメント付けは要らないと思う。
基本保証以下の場合は例外発生時の状態についてドキュメントで触れておくべきだと思う。
456420:2010/02/06(土) 11:56:13
>>454-455
ありがとうございます。
勉強させていただきます。
457424:2010/02/06(土) 12:07:04
どなたか>>424に愛の手をさしのべてくださる方は
いらっしゃいませんか?

よろしくお願いします。
458デフォルトの名無しさん:2010/02/06(土) 14:23:23
いいんじゃね?
パッと見constや参照の違いにょる挙動の違いを見ているだけだと思うけど、確認したいポイントは?
459デフォルトの名無しさん:2010/02/06(土) 15:10:37
>>458
delete後はコピーであるnum1とnum4は有効で、
それ以外は無効だろうと思っているのですが、
num2, num3, num6についてはconst参照で束縛すると挙動が変わったりするのか
という点が疑問でした。

460424:2010/02/06(土) 15:17:23
追記:

 vc++
 ttp://uploader.sakura.ne.jp/src/up3481.jpg
 dmc
 ttp://uploader.sakura.ne.jp/src/up3480.jpg
 bcc
 ttp://uploader.sakura.ne.jp/src/up3479.jpg

このようにコンパイラによって結果が違うのですが、
num2, num3, num6については全て未定義の動作
(たまたま同じ値が出力されただけで、
 結果が違うとかそういう問題じゃない)
ということでしょうか?
461デフォルトの名無しさん:2010/02/06(土) 15:20:48
参照先はdeleteしたんだろ?
はっきり言ってconstだろうとなかろうとnum2, num3, num6を評価した時点でプログラムがハングしても文句は言えないからな。
462デフォルトの名無しさん:2010/02/06(土) 15:22:22
const参照が束縛できるのはあくまでテンポだよ
463デフォルトの名無しさん:2010/02/06(土) 15:28:26
>>461
文句を言いたい訳じゃねえんじゃね?
464424:2010/02/06(土) 15:29:22
const な参照は一時オブジェクトを束縛する [5.5] [10.4.10]

ってヤツと混同してました。

ありがとうございました。
465デフォルトの名無しさん:2010/02/06(土) 15:31:42
>>460
鼻から悪魔
466デフォルトの名無しさん:2010/02/06(土) 15:35:44
>>418
>なんで、privateな変数はポインタだらけなの?
逆じゃね?ポインタ変数はprivateにして隠蔽するからじゃないか?

467デフォルトの名無しさん:2010/02/06(土) 15:38:02
num1の生成にheavy_int_classのコピーコンストラクタが走る。
num1がコピーされたインスタンス。

num2の生成にコピーは発生しない。
num2とp->numは同じインスタンス。同じ型。

num3の生成にコピーは発生しない。
num3とcp->numは同じインスタンス。
前者はconst修飾されていて変更不可、
cpはpointeeがconst修飾されているのでcpから得られるメンバは総じて変更不可。

num4はnum1と同じくコピー。
通常、コピーコンストラクタはconst referenceの仮引数であるので挙動に変化なし。

num5はnum3の理由によりコンパイルエラー。
参照は定義時に使われたインスタンスを指すオブジェクト。

num6はcp->numと同じインスタンス。但し変更されない事を宣言時に明示している。
よって型検査の上では正常。


いずれにせよ、参照は単にポインタの糖衣構文に過ぎずプログラマーが参照は図示を明記しなくても良いというだけ。
cons参照が特殊なのは壊れてないスタックにあるインスタンスをコピーコストなしで見られる点。
468467:2010/02/06(土) 15:41:40
説明不足だったが、組み込み方やPODに関してはコピーコンストラクタがない。
単純にメモリがコピーされるだけの処理に置き換わる。
最適化によってはコピーが発生せず、変数宣言が消失したり関数がinlineされたりなどする。
この挙動の違いは非PODな型を使う時に最適化を考えて書く時に重要なものになる。
469デフォルトの名無しさん:2010/02/06(土) 16:18:45
>462
逆じゃないの? テンポラリオブジェクトを束縛するにはconst参照でなくてはいけないけど、
const参照がテンポラリオブジェクトしか束縛できないというわけじゃないと思うけど。
仮変数とかでバリバリ使ってるし。
470デフォルトの名無しさん:2010/02/06(土) 16:34:04
>>467 参照にはヌルポインタのような状態がないことも重要だよ。
471デフォルトの名無しさん:2010/02/06(土) 16:37:00
>>468
それはコンパイラの実装に踏み込んだ余計な知識だろう。
一般的に言えるものじゃないので、そのレベルの最適化を考えるんなら自分の環境で
アセンブリリスト吐かせて確認するべき。
472デフォルトの名無しさん:2010/02/06(土) 17:35:58
C++ってC言語よりもポインタが排除されている気がする
473デフォルトの名無しさん:2010/02/06(土) 17:38:17
気がするも何も、まったくもってそのとおりなのです。
474デフォルトの名無しさん:2010/02/06(土) 17:45:54
>>471
副作用のない部分をよりコストの低い処理へと置き換える、という事は一般的だとは思うけど。
475デフォルトの名無しさん:2010/02/06(土) 17:52:43
>>474
うんうん。最適化って言うのはそういうものだね。

で?
476デフォルトの名無しさん:2010/02/06(土) 17:53:33
ポインタが排除されているというより、ポインタにまつわる危険性が
排除されているというべきだろう

C++で多態性(ポリモルフィズム)をするにはポインタを介するしか
ないわけだし
477デフォルトの名無しさん:2010/02/06(土) 17:55:16
あ、正確には参照でもポリモルフィズムは出来るけど実際には
静的に近い解決がされちゃうし
478デフォルトの名無しさん:2010/02/06(土) 17:57:56
参照
479デフォルトの名無しさん:2010/02/06(土) 19:55:59
> ポインタにまつわる危険性

これがネックになる人は PG どころか一般事務もダメだろ
顧客コードだの ID の類が管理できないわけで
自立した成人としての基礎的な能力に問題がある
480デフォルトの名無しさん:2010/02/06(土) 20:10:45
必要ないところでもポインタを使いまくるオレ様スゲー、ということにしたいのですね。わかりますん。
481424:2010/02/06(土) 20:20:28
>>467-471
ご丁寧に解説いただき、理解が進みました。
どうもありがとうございます。
482デフォルトの名無しさん:2010/02/06(土) 20:56:08
パラメータがポインタの関数に、&で変数のアドレスを渡すとどうなるのですか?
void test(hoge* h)に対して、test(&h);みたいな感じに
そのあとに、GUIのイベントループにさせたりするとして
483デフォルトの名無しさん:2010/02/06(土) 21:02:37
>>482
どうなるもこうなるも、普通で問題ないと思うのですが、どういう回答をお望みですか?
484デフォルトの名無しさん:2010/02/06(土) 21:24:45
エスパーしてみる。

>>482はポインタとアドレスを別物だと思っているんじゃないか?

いやある意味別物だけど。

・・・さすがにそういう意味じゃないかな。
485482:2010/02/06(土) 21:29:16
スコープ的にどうなのかな〜と
いまいち、そこら辺がわからない
486デフォルトの名無しさん:2010/02/06(土) 21:36:35
>>485
スコープが分からんとは。
自動変数とかそう言う話っぽいな。

誰か説明してやってくれ
487482:2010/02/06(土) 21:44:15
>>486
普通の変数や、newした変数の寿命はわかるのですが
普通の変数のアドレスを外部の関数に渡した場合と、
変数を使った場合がよくわからないんです

自分で調べたい所ですが、イマイチ方法がわからずorz
488デフォルトの名無しさん:2010/02/06(土) 21:44:40
初心者スレへ
489デフォルトの名無しさん:2010/02/06(土) 21:51:24
C++ていうか、C言語のポインタが分かってない感じだな。
適当にググってポインタについて勉強すれ。
490デフォルトの名無しさん:2010/02/06(土) 22:06:34
たしかに、C言語初心者スレへ誘導するのが吉か。

C言語なら俺に聞け(入門編)Part 60
ttp://pc12.2ch.net/test/read.cgi/tech/1264920499/

ここがいいんじゃない?
491デフォルトの名無しさん:2010/02/06(土) 22:12:10
普通の変数ってなんだよw
普通じゃない変数があるのか?
492デフォルトの名無しさん:2010/02/06(土) 22:25:20
(1)普通の変数のアドレスを外部の関数に渡した場合。
(2)変数を使った場合。

どういう状況を言っているのか全くわからん。
ひどすぎる。
493デフォルトの名無しさん:2010/02/06(土) 22:44:27
変数を使った場合
って何事w

今までC/C++で変数を使わないでプログラミングしたことねぇよ。
494デフォルトの名無しさん:2010/02/06(土) 22:44:49
>487
スタックフレーム、駆動レコード、継続あたりの話ね。


「外部の関数」と考えると確かに判りづらいな。
まずは「呼び出し元の関数」と「呼び出し先の関数」というのを想像して、それぞれの
動きを見てみると良いかも。

C++の場合「呼び出し先の関数」が終わらないと「呼び出し元の関数」も終わらないから、
「呼び出し元の関数」にある変数も「呼び出し先の関数」が終わるまでは無くならない。
なので、変数の(スタックに積んである)ポインタを実変数として渡しても問題になることはないんだよね。

495486:2010/02/06(土) 22:45:45
>>494
やさしいなぁお前は。見習わなきゃ。
496487:2010/02/06(土) 22:57:15
>>494
わざわざ、丁寧な返答ありがとうございました
Qtとかのフレームワークでプログラミングをしたいなと思っていたので、
中身がブラックボックス化されていて頭がゴチャゴチャしていましたorz

えぇ〜と、周りに迷惑なのでこの話はここら辺で止めておきます
497デフォルトの名無しさん:2010/02/06(土) 23:07:20
>>496
> Qtとかのフレームワークでプログラミングをしたいなと思っていたので、
> 中身がブラックボックス化されていて頭がゴチャゴチャしていましたorz
Qt!?
悪いことは言わん。やめとけ。
いくらブラックボックスとはいえそのレベルじゃ使えないでしょ。
その前に猫のサイト等ででもC言語の勉強をすべきでは?
498デフォルトの名無しさん:2010/02/06(土) 23:38:09
>>497
えぇ、もちろん使えませんよ
いろいろと忙しくて、1ヶ月くらいしかC++の勉強をしてませんからね
1〜2年程度の長いサイクルで考えてるんで
499デフォルトの名無しさん:2010/02/06(土) 23:39:42
C++でデータとしての数値のみを持つ構造体
(struct Point { int X; int Y };とか)
をコピーするとき、一番早い方法ってなんですかね?

素直に=でコピーがいいんですか?
500デフォルトの名無しさん:2010/02/06(土) 23:40:23
実測が基本
501デフォルトの名無しさん:2010/02/06(土) 23:42:56
41秒で反応する実測厨の気持ち悪さ
502デフォルトの名無しさん:2010/02/06(土) 23:44:37
その処理に関しては、コンパイラが十分に賢いので=で良い。
503デフォルトの名無しさん:2010/02/07(日) 00:00:06
それってコピコンは書く必要は無いっていうこと?
504デフォルトの名無しさん:2010/02/07(日) 00:04:05
うん。コピー代入演算子も書かなくていい
505デフォルトの名無しさん:2010/02/07(日) 00:45:35
ポインタで文字列の何文字目から何文字文だけわたすってことはできますか?
506デフォルトの名無しさん:2010/02/07(日) 00:51:17
ポインタ1つでは無理
507デフォルトの名無しさん:2010/02/07(日) 01:28:48
>>505
STL流儀のbegin(),end()がまさにそれだろ。
iteratorはポインタの抽象だよ。
508デフォルトの名無しさん:2010/02/07(日) 10:07:23
>>497
CとC++は別物。焼きそばとカップ焼きそばくらい違う。
509デフォルトの名無しさん:2010/02/07(日) 10:26:19
お寿司とカリフォルニア巻くらい違う。
510デフォルトの名無しさん:2010/02/07(日) 10:35:22
どれも底辺が喜んで食う物ってのがまたw
511デフォルトの名無しさん:2010/02/07(日) 11:05:46
カテゴリは同じだけどグレードが違うってことでしょ
512デフォルトの名無しさん:2010/02/07(日) 11:23:49
最近はこのスレ荒れるなぁ。

ちょっとはみんな自重しようぜ。
513デフォルトの名無しさん:2010/02/07(日) 11:29:55
そこはグレードは同じだけど、カテゴリが違うってしておかないと
514デフォルトの名無しさん:2010/02/07(日) 12:41:01
C++ソースで、
文字コードUTF-8 + 改行コードLF
で統一しているのですが、
BOMってヤツは付けた方が良いのでしょうか?
よろしくお願いします。
515デフォルトの名無しさん:2010/02/07(日) 13:25:59
すみません他スレ行ってきます。
516デフォルトの名無しさん:2010/02/07(日) 14:41:41
コンストラクタに初期化並び?を書くと何か最適化されるの?
abc() : member(0) {}
517デフォルトの名無しさん:2010/02/07(日) 14:47:45
そこに初期化子を書かないと初期化できないじゃないか。
518デフォルトの名無しさん:2010/02/07(日) 14:50:02
最適化関連はアセンブラコード見て確認してみ?
519デフォルトの名無しさん:2010/02/07(日) 14:50:53
>>516
そこにかかずしていつ初期化するのだい?
520デフォルトの名無しさん:2010/02/07(日) 15:03:33
案外utf-8が扱えなかったりするやつがいることも考えると

C++なら文字コードは全部
"Shift JIS" + "CR+LF"
で統一するのがオススメ。(正確にはCP932か。)
現実的にこれなら扱えないコンパイラやOSはまず無い。
(M$様が圧倒的なシェアを持っている都合上
 対応せざるを得ないんだろうな。)

日本語とか完全無しってのが理想だろうけどさ。

ってのが俺の持論なんだが。
賛成意見・反論など大募集。
521デフォルトの名無しさん:2010/02/07(日) 15:07:48

hoge() { member = 0; }

コンストラクタの中に書く俺は異常なのか・・・?
522デフォルトの名無しさん:2010/02/07(日) 15:08:59
>>521
異常というか、C++の初期化子の意味を理解してください。

・・・Effective C++すら読んでないでしょ。
523デフォルトの名無しさん:2010/02/07(日) 15:10:03
>>521
それ初期化やない、代入や。
524デフォルトの名無しさん:2010/02/07(日) 15:11:15
俺はメンバの数が圧倒的にふえるとそう書くな
525デフォルトの名無しさん:2010/02/07(日) 15:12:39
>>521

節子、それ、初期化やない、代入や!

って言おうと思ったら既に言われてしまった。
526デフォルトの名無しさん:2010/02/07(日) 15:13:39
>>524
お前もかよwこのスレは・・・。
Effective C++ぐらい読めよ。そして従えよ。
527デフォルトの名無しさん:2010/02/07(日) 15:14:13
つ constメンバ変数
528デフォルトの名無しさん:2010/02/07(日) 15:14:36
引数なしの場合って書く?
529デフォルトの名無しさん:2010/02/07(日) 15:19:37
constメンバをstaticじゃなく宣言する意味ってなんかあんのか
530デフォルトの名無しさん:2010/02/07(日) 15:20:14
引数なしだと組み込み型はそれを明示しないと初期化されないので、初期化したい場合は書く。
どうでもいい場合は書かない。
531デフォルトの名無しさん:2010/02/07(日) 15:21:12
>>528
何の引数が無い場合?メンバ変数(クラス)ならそいつらのデフォルトコンストラクタで初期化しとけば良いじゃん。
532デフォルトの名無しさん:2010/02/07(日) 15:24:21
>>529
初期化のタイミングで値が決まるが、クラス内部で変更するつもりがない変数に有効。
533デフォルトの名無しさん:2010/02/07(日) 15:29:21
class Hoge
{
  Test a;
public:
  Hoge() {} // aはデフォルトでおk
};

別にこれなら初期化子はいらないよな
534デフォルトの名無しさん:2010/02/07(日) 15:34:32
>>530
組み込み型のメンバーは、boost::initialized_value<double> jissuu;にするから所期化忘れは無い。

535デフォルトの名無しさん:2010/02/07(日) 15:34:33
そういや空のコンストラクタはどう最適化されるんだ?
教えてくれ
536デフォルトの名無しさん:2010/02/07(日) 15:36:38
>>535 知るか。アセンブリ吐かせて見ろ。
537デフォルトの名無しさん:2010/02/07(日) 15:38:23
アセンブラコード見なさいよ
538デフォルトの名無しさん:2010/02/07(日) 15:38:36
C++をやっててboostに触ってないってのはモグリですか
539デフォルトの名無しさん:2010/02/07(日) 15:39:14
>>521
C#やってた人がやらかすな。
540デフォルトの名無しさん:2010/02/07(日) 15:40:09
>>538
はい。
それとVCしか使えない人もモグリです。
541デフォルトの名無しさん:2010/02/07(日) 15:42:31
>>538
メモリーリーク?なにそれ?おいしいの?
なんだSTLって使い物になるんじゃん。
MPLすげー。ソースコードが半分になるじゃん。

C++の世界が全く変わるよ。良い意味で。
542デフォルトの名無しさん:2010/02/07(日) 15:44:15
>>538
さすがにねぇ。。

>>541
> メモリーリーク?なにそれ?おいしいの?
いいすぎだろw
メモリーリークを知っているからこそ
役立つんだろ?

543デフォルトの名無しさん:2010/02/07(日) 15:45:34
boostいらねよ。
使えるのはメモリー管理だけだろ。
それ以外たいして入らない。
メモリも他のライブラリで代替えすれば完全に入らない。
544デフォルトの名無しさん:2010/02/07(日) 15:47:36
>>543
いるか要らないかねぇだろ
本題を読めよw
545デフォルトの名無しさん:2010/02/07(日) 15:48:07
>>543
最初の行が矛盾してるぜ。

欲しいところだけ使いたいのに、全部入れるとでかすぎるって話なら同意。
546デフォルトの名無しさん:2010/02/07(日) 15:50:39
* typedef struct hogehoge..., (struct fuga*)malloc(sizeof(struct fuga))...
 C++は初めてか?肩の力抜けよ。

* catch(...){ throw; }
 落ち着け

* カスタムアロケータを自作したり等、STLをやっと使いこなせるレベル
 頑張って^^;

* shared_ptrやMPL等でboostを導入しまくる
 そうだよね保守性は重要だよね

* boostのソースから必要な部分だけもってきて改変
 本当に分かってやってるのか?という懸念
547535:2010/02/07(日) 15:53:20
asmみたけど空のコンストラクタも呼び出されてる。

>>499
試したけど、コンパイラ定義の代入はmovで初期化されているな。

>>516
これはよくわからんかった。

548デフォルトの名無しさん:2010/02/07(日) 15:58:25
初期化並びに書かなければ
その(コンパイラが自動的に生成した)空のコンストラクタが呼ばれた後に
再度代入が行われて二度手間になる
549デフォルトの名無しさん:2010/02/07(日) 15:58:43
boostは中身を理解して使うならいいよ
理解せずに使うやつは潜り
550538:2010/02/07(日) 16:00:23
そうかー…
SymbianでC++をやってた自分としてはboostは若干異世界なんだよね
551デフォルトの名無しさん:2010/02/07(日) 16:01:39
initialization listの日本語訳が初期化並びか
JIS X3014でもこんな気持ち悪い訳語使ってんのかな?
552デフォルトの名無しさん:2010/02/07(日) 16:04:25
>>550
そういう事情があるなら別だよ!
ただ一般論として
boostが通らない環境でない限りは
見といた方がいいんじゃね?
553デフォルトの名無しさん:2010/02/07(日) 16:04:36
>>547
どんな環境で何をどう試したの?
554デフォルトの名無しさん:2010/02/07(日) 16:05:13
すごいスレの伸びだな
555デフォルトの名無しさん:2010/02/07(日) 16:06:27
JISには海外から取り入れる際に翻訳規定がいろいろ定められてる。
文法上の意味と用語の立場からその規定が当てはめられる。
規定を定めた大元は天下りのアレが大きな役割を果たしていたので、
翻訳の仕事をした人を責めるわけにもいかないだろうに。
556535:2010/02/07(日) 16:08:48
VS2010b2 win32コンソールアプリ debugで試した。
557デフォルトの名無しさん:2010/02/07(日) 16:09:37
デバッグモードじゃ最適化されないよ!
558535:2010/02/07(日) 16:10:43
そ・・・そうだった・・・
559デフォルトの名無しさん:2010/02/07(日) 16:10:44
いや、設定したオプションにもよるだろjk
560デフォルトの名無しさん:2010/02/07(日) 19:24:43
>551
>JIS X3014でもこんな気持ち悪い訳語使ってんのかな?
以前 C++ 関連記事を翻訳しようとした時に、JIS X 3014 の訳語を基準にしようかと
思ったけど、あまりにも現実との乖離が大きいので一般的なプログラマにとって
理解不能とまでは言わないけど脳内再翻訳が必要だと思って諦めた事がある。

preprocessing tokens   前処理字句
escape-sequence     逆斜線表記
function prototype     関数原型
unqualified name lookup 修飾なし名前の名前検索
initializer-list        初期化子並び
aggregates         集成体

一事が万事こんな感じで一般的な用法から訳しすぎと思われ。
561デフォルトの名無しさん:2010/02/07(日) 19:55:42
>>560
そうかなぁ。わかりやすいと思うけど。
562デフォルトの名無しさん:2010/02/07(日) 19:57:59
自分はエスケープシーケンス・関数プロトタイプ・修飾なし(の)名前探索以外はそれでいいと思う。
563デフォルトの名無しさん:2010/02/07(日) 20:07:31
集成体は良い訳だと思うけどな
エスケープシーケンスはひどいけど
564デフォルトの名無しさん:2010/02/07(日) 20:59:10
神経とか治具みたいな神翻訳だったら使いやすいんだけど
565デフォルトの名無しさん:2010/02/07(日) 21:20:09
明治の人は偉大だった
566デフォルトの名無しさん:2010/02/07(日) 21:21:44
高等遊民タヒね
567デフォルトの名無しさん:2010/02/07(日) 21:25:27
>>529
staticじゃインスタンス間で共有されちゃうじゃない
568デフォルトの名無しさん:2010/02/07(日) 22:26:51
関数の引数にconstで参照を渡す場合って

void F(const Obj& o)であってる?
569デフォルトの名無しさん:2010/02/07(日) 22:30:48
>>568
うん、それで問題ない。
570デフォルトの名無しさん:2010/02/07(日) 22:32:57
constはコンパイル時に値に置き換えてほしい
571デフォルトの名無しさん:2010/02/07(日) 22:34:51
>>570
できるのとできないのがあるだろさすがに。
572デフォルトの名無しさん:2010/02/07(日) 22:50:44
木曜日発売のテンプレートの本
って糞本でしょうか?

えぴなんちゃらのエセ本と類似品?
573デフォルトの名無しさん:2010/02/07(日) 22:55:50
えぴなんちゃらのエセ本てw
C++標準化委員会のメンバーなのに絶対名前で損してるなぁ
574デフォルトの名無しさん:2010/02/07(日) 23:12:03
えぴなんちゃらのは糞本なの?
575デフォルトの名無しさん:2010/02/07(日) 23:35:19
コンストラクでnewに失敗した場合
例外投げるのはダメなんですよね?

どうすればいいんだろう
576デフォルトの名無しさん:2010/02/07(日) 23:37:26
>>575
ダメじゃない。
思う存分なげなさい。

・・・あるいはinit関数を用意する手も。
577デフォルトの名無しさん:2010/02/07(日) 23:44:23
try :
mhoge(0)
{
mhoge = new..
}
catch(...)
{
delete mhoge;
}

これでもリークするもんなぁ
どうすればいいんだろう困った
578デフォルトの名無しさん:2010/02/07(日) 23:48:01
それはスマートポインタ使う以外に方法がないでしょ。
579デフォルトの名無しさん:2010/02/07(日) 23:53:10
見た感じ問題なさそうな気がするんだけど
580デフォルトの名無しさん:2010/02/08(月) 00:01:56
コンストラクタの中でnewするんなら自分で片付けろよ
581デフォルトの名無しさん:2010/02/08(月) 00:08:06
mhoge がポインタで
mhoge = new ...; でnewに失敗
  メモリ確保、hoge(?)のコンストラクタ、メモリ解放、例外送出

メモリリークする?
582デフォルトの名無しさん:2010/02/08(月) 00:09:40
やっぱ3行目は無しで
583デフォルトの名無しさん:2010/02/08(月) 00:28:05
>>577 それ、どういう経路でリークするの?
584 ◆GWRSHcLrd6 :2010/02/08(月) 17:52:41
お久しぶりです。
スマートポインタをまた改造しました。

ttp://cdtest.genin.jp/projects/smart_ptr/index.htm

バグの報告、どんな細かいことでもいいのでお願いします。
誰か実測、テスト用のコードを書いてくれませんか?
585デフォルトの名無しさん:2010/02/08(月) 17:54:22
class Base { public: virtual int GetClassID(void) = 0; };

class SubA : public Base { public: int GetClassID(void) { static int x; return reinterpret_cast<int>(&x); };
class SubB : public Base { public: int GetClassID(void) { static int x; return reinterpret_cast<int>(&x); };
class SubC : public Base { public: int GetClassID(void) { static int x; return reinterpret_cast<int>(&x); };

全部の派生クラスに同じコード書くのはめんどいんですが
マクロ以外でこれを簡略化することはできますかね?
586デフォルトの名無しさん:2010/02/08(月) 18:04:28
基底に書けばいいじゃない
587デフォルトの名無しさん:2010/02/08(月) 18:05:50
>>586
基底に書いたら意味が変わっちゃう
588デフォルトの名無しさん:2010/02/08(月) 18:07:41
>>585
みたいななんか嫌なid使うのって一般的なのか?
589デフォルトの名無しさん:2010/02/08(月) 18:08:08
意味が変わる・・・? 見る限り変わるようには見えないけど。
590デフォルトの名無しさん:2010/02/08(月) 18:09:04
typeid(), type_infoを使わないのはなんで?
591デフォルトの名無しさん:2010/02/08(月) 18:09:07
>>589
本気て言ってるのなら勉強し直してくれ
592デフォルトの名無しさん:2010/02/08(月) 18:09:25
オープンソースのコードに組み込んで確認したりパフォーマンスうpてくれ
593デフォルトの名無しさん:2010/02/08(月) 18:20:51
>>585みたいなIDってどう使うん?
基底クラスのポインタを使えば
仮想関数自体が自動的に派生クラス別に処理を分けてくれるような仕組みを提供できるのに
594デフォルトの名無しさん:2010/02/08(月) 18:23:12
>>592
何に対して言っているんだ?
595デフォルトの名無しさん:2010/02/08(月) 18:31:50
型のIDを調べるなんぞ、OOPLに対して失礼だ。
フォークとナイフがあるのに肉を手づかみしちゃうような行為。
596デフォルトの名無しさん:2010/02/08(月) 18:33:39
584 名前: ◆GWRSHcLrd6 [] 投稿日:2010/02/08(月) 17:52:41
お久しぶりです。
スマートポインタをまた改造しました。
597デフォルトの名無しさん:2010/02/08(月) 18:34:09
>>590
RTTIのコスト避けたいとか?
598デフォルトの名無しさん:2010/02/08(月) 18:34:58
>>589
>static int x; return reinterpret_cast<int>(&x);
各クラスでsutatic宣言した変数 x のアドレスをIDとしている。
規定でやるとどれも同じ変数 x のアドレスになるので 目的を果たせない。

ということ。
599デフォルトの名無しさん:2010/02/08(月) 18:42:06
>>592
boostとどっちが優れているんだろうな。
600デフォルトの名無しさん:2010/02/08(月) 18:43:02
俺もOO的にどうなのかとは思うけど
たとえばこんなんはどうよ
template <typename T> int tid(const T&t){
static T* x;
return reinterpret_cast<int>(&x);
}
class SubA : public Base {};
class SubB : public Base {};

SubA a;
SubB b,c;
cout << tid(a) << endl;
cout << tid(b) << endl;
cout << tid(c) << endl;
601デフォルトの名無しさん:2010/02/08(月) 18:47:35
>>599
あんなキチガイ連中(褒め言葉)と比べてやるなよ
602デフォルトの名無しさん:2010/02/08(月) 18:49:15
キチガイのやつはスマポのサイズが2倍
読みづらい
603デフォルトの名無しさん:2010/02/08(月) 18:52:56
つーか、同じシンタックスのコードを派生クラスに自動定義させる方法、があるか聞きたかった
質問の仕方が悪かったのは自覚してる。反省してる


>>593
ハッシュを使って、クラスに対して任意のデータを動的に関連付けたいときとかに使えないかな?
隠蔽されたクラスを使う側のためのstaticメンバの後付けみたいな用途で
604デフォルトの名無しさん:2010/02/08(月) 19:09:51
class Base { public: virtual int GetClassID(void) = 0; };
template <class T> class Middle : public Base { public: int GetClassID(void) { static int x; return reinterpret_cast<int>(&x); }};
class SubA : public Middle<SubA> {};
class SubB : public Middle<SubB> {};
class SubC : public Middle<SubC> {};
605デフォルトの名無しさん:2010/02/08(月) 19:20:31
すばらしい
606デフォルトの名無しさん:2010/02/08(月) 19:21:23
>>604
それも考えたんですが、継承関係が深い場合には使えないんですよね
607デフォルトの名無しさん:2010/02/08(月) 19:22:06
スマートポインタのテストってどういうの作ればいいんだ?
608デフォルトの名無しさん:2010/02/08(月) 19:32:27
派生クラスのポインタに代入できるとか
if(p)で使えるとか
NULLポインタのつもりで0をはじくとか
循環参照を作ってみてリークするか調べるとか
自己代入してみるとか
例外を投げるクラスを入れてみるとか
609デフォルトの名無しさん:2010/02/08(月) 19:34:02
で、こいつはどうなんだ?
610デフォルトの名無しさん:2010/02/08(月) 19:42:10
> if(p)で使えるとか

スマートポインタってそんなこともできるのか?
611デフォルトの名無しさん:2010/02/08(月) 19:42:17
チェックするのめんどい
612デフォルトの名無しさん:2010/02/08(月) 19:42:59
できるよ。さっきの人のはoperator boolを実装してるから出来るはずさ
試してないけど
613デフォルトの名無しさん:2010/02/08(月) 19:46:14
operator boolなんてもんがあるのか…。
じゃあそのまんまだなw
614 ◆GWRSHcLrd6 :2010/02/08(月) 19:53:30
みなさん、ありがとうございます。
大体のことはできるようになっていると思うのですが…
615デフォルトの名無しさん:2010/02/08(月) 21:27:06
>>614
More C++ Idioms/安全な bool(Safe bool)
ttp://ja.wikibooks.org/wiki/More_C++_Idioms/%E5%AE%89%E5%85%A8%E3%81%AA_bool(Safe_bool)

>>604
が綺麗な気がするけどなぁ。
そんな変な処理をしたいにもかかわらずマクロを嫌うなら自前のプリプロセッサを使うとか
しかねぇんでね?。
(Qt的な。)

616デフォルトの名無しさん:2010/02/08(月) 21:28:41
typeidじゃだめなんですか?
617デフォルトの名無しさん:2010/02/08(月) 22:05:05
クラスの識別をしたい→クラスによって処理を変えたいってことなのだろうか?
仮想関数>visitor>>>>>>>RTTI(typeid) が一般的な解決策かなあ。
618デフォルトの名無しさん:2010/02/08(月) 22:07:27
コンパイラがコンパイル時に多重継承だのオーバーライドの範囲だのを検出して
仮想関数テーブルを最適化してくれるならvirtul使ってもいい
619デフォルトの名無しさん:2010/02/08(月) 22:26:48
class Base{〜};
#include "subc.tsv"

サブを数十作るならエクセルでコピペしちまう
620デフォルトの名無しさん:2010/02/08(月) 22:32:11
new Test[100];

のように配列で確保する場合に
デフォルトのコンストラクタが無い場合の
new[]ってどのように記述するのが一般的なのでしょうか。
new[]のカスタムの定義の方法がよくわかりません。

それとも、コンストラクタはデフォルトのみにして
create_arrayみたいな関数でアロケートするのが
一般的ななのでしょうか。
621デフォルトの名無しさん:2010/02/08(月) 22:33:19
static_cast<Test*>(::operator new(sizeof(Test[100])));
622デフォルトの名無しさん:2010/02/08(月) 22:38:05
>>607

http://codepad.org/e9YaTqes

比較になるのか分からんけど
623デフォルトの名無しさん:2010/02/08(月) 22:40:00
Mobile AMD Sempron 3600+, x86 win32, debug

boost::shared_ptrのベンチマーク
単純な生成ループ: 546
代入ループ: 515
オブジェクトのリセット: 936
オブジェクトの解放: 484

framework::smart_ptrのベンチマーク
単純な生成ループ: 452
代入ループ: 468
オブジェクトのリセット: 889
オブジェクトの解放: 453

smart_ptrの方が速い
624デフォルトの名無しさん:2010/02/08(月) 22:43:25
boostはスレッドサポートしてるからかな
625デフォルトの名無しさん:2010/02/08(月) 22:43:49
releaseでやれ
626デフォルトの名無しさん:2010/02/08(月) 22:44:04
thread-safeじゃないからな
627デフォルトの名無しさん:2010/02/08(月) 22:44:12
BOOST_DISABLE_THREADSやろうぜ
628デフォルトの名無しさん:2010/02/08(月) 22:44:17
boostのがよくレビューされている。
629デフォルトの名無しさん:2010/02/08(月) 22:44:24
同環境, Release, 最適化(Ox)

boost::shared_ptrのベンチマーク
単純な生成ループ: 540
代入ループ: 511
オブジェクトのリセット: 897
オブジェクトの解放: 498

framework::smart_ptrのベンチマーク
単純な生成ループ: 488
代入ループ: 477
オブジェクトのリセット: 882
オブジェクトの解放: 481
630デフォルトの名無しさん:2010/02/08(月) 22:48:13
同上、BOOST_DISABLE_THREADS

boost::shared_ptrのベンチマーク
単純な生成ループ: 561
代入ループ: 453
オブジェクトのリセット: 858
オブジェクトの解放: 452

framework::smart_ptrのベンチマーク
単純な生成ループ: 453
代入ループ: 436
オブジェクトのリセット: 827
オブジェクトの解放: 437
631デフォルトの名無しさん:2010/02/08(月) 22:49:41
ついに変態(boost)を超えたな
632デフォルトの名無しさん:2010/02/08(月) 22:49:47
boostは糞ということがよくわかるベンチマークだな
633デフォルトの名無しさん:2010/02/08(月) 22:52:13
記念age
634デフォルトの名無しさん:2010/02/08(月) 22:54:57
>>621
それ危険でしょ
635630:2010/02/08(月) 22:56:32
>630
SPが抜けてた
636デフォルトの名無しさん:2010/02/08(月) 23:15:34
>>632
しかしboostでなければ上司を説得できないなど良くある話。
そもそもthread unsafeなのと比較してもねぇ。

・・・あ、Lokiは早いらしいって噂を聞いた。動けばの話だが。
637デフォルトの名無しさん:2010/02/08(月) 23:22:41
どんなコードで比較してるかも分らないベンチではね。
638デフォルトの名無しさん:2010/02/08(月) 23:29:23
>>637
>622
639デフォルトの名無しさん:2010/02/08(月) 23:34:19
スレッド アンセーフは BOOST_SP_DISABLE_THREADSで
プラマイ0と考えても少し早いな

なぜ?
640デフォルトの名無しさん:2010/02/08(月) 23:35:44
smart_ptrの方はインテリセンスが良く働いてくれる
641デフォルトの名無しさん:2010/02/08(月) 23:54:01
やねうらおがクソだってことは分かった
642デフォルトの名無しさん:2010/02/08(月) 23:56:31
boost::shared_ptrのベンチマーク
単純な生成ループ: 55
代入ループ: 56
オブジェクトのリセット: 70
オブジェクトの解放: 33

framework::smart_ptrのベンチマーク
単純な生成ループ: 32
代入ループ: 32
オブジェクトのリセット: 65
オブジェクトの解放: 32

PGOもしたがBoostが勝つ結果がでない
643デフォルトの名無しさん:2010/02/09(火) 00:00:18
0xがまともに制定されたらboostの中の人も本気出すはず
644デフォルトの名無しさん:2010/02/09(火) 00:02:15
boostの時代終わったな
645デフォルトの名無しさん:2010/02/09(火) 00:17:35
残念ながら終わらない
646デフォルトの名無しさん:2010/02/09(火) 01:26:22
フフフ……boost::shared_ptrは四天王の中でも最遅……
647デフォルトの名無しさん:2010/02/09(火) 01:29:56
それはハカイダー四人衆にたとえると何色ですか?
648デフォルトの名無しさん:2010/02/09(火) 01:34:11
>>584
gcc でコンパイルできん。

> 互換性報告などもお願いします。
互換性もたせるつもりなら gcc ぐらい自分で試しといてくれよ。
649デフォルトの名無しさん:2010/02/09(火) 01:46:00
純粋仮想デストラクタって何に使うの?
650デフォルトの名無しさん:2010/02/09(火) 03:12:22
なんか勘違いが見受けられるが、shared_ptrは標準に含まれるスマートポインタとしての
バイナリ互換性や安全性を目的としているんだから
速度がオレオレスマートポインタに負けるのは当たり前でしょ。
十分に検証されたスマートポインタはそう簡単には作れないよ。
651デフォルトの名無しさん:2010/02/09(火) 07:15:38
こいつバカです
652デフォルトの名無しさん:2010/02/09(火) 07:18:56
653デフォルトの名無しさん:2010/02/09(火) 08:40:33
> 'void (__thiscall TEST::* )(void)' から 'void (__thiscall TEST::* &)(void)' に変換出来ません
なんでstdcallは参照取れるのにthiscallは参照取れないんだ・・・
設計したやつ出て来て説明しる!
654デフォルトの名無しさん:2010/02/09(火) 08:52:18
thisポインタの参照が取れたらカプセル化がえらいことになるからじゃねえ?
655デフォルトの名無しさん:2010/02/09(火) 08:53:59
ごめん、適当に言ってみただけ
656デフォルトの名無しさん:2010/02/09(火) 09:03:02
>>653
T* から T*& に変換できないと言っているだけのように見えるが、
stdcall とか thiscall とか関係あるの?どんなソース書いたの?
657デフォルトの名無しさん:2010/02/09(火) 09:17:06
なんかすまんコピペミスった
本当はこんなことしたかった

template<class T>
void hoge(T& in){
in();
}

void huga1(){
fprintf(stderr, "huga1");
}

struct TEST{
void huga2(){
fprintf(stderr, "huga1");
}
};

int main(){
hoge(huga1);
hoge(TEST::huga2);
}
658デフォルトの名無しさん:2010/02/09(火) 09:21:38
それならstaticをつければいいだけなんじゃ
struct TEST{
static void huga2(){
fprintf(stderr, "huga1");
}
};
659デフォルトの名無しさん:2010/02/09(火) 09:31:17
おぉなるほど・・・しかしユースケースだと非staticにも対応しないといけないんだ
もう少しヒネって考えてみるよ
660デフォルトの名無しさん:2010/02/09(火) 09:45:21
非staticなんだったら
オブジェクトを生成して
TEST obj;
hoge(&obj::huga2);
みたいにしないと
661デフォルトの名無しさん:2010/02/09(火) 09:49:37
operator() の出番じゃないの?
662デフォルトの名無しさん:2010/02/09(火) 10:01:19
>>660
そんなことできません。

&TEST::huga2 と obj をまとめて渡さないと。
663デフォルトの名無しさん:2010/02/09(火) 10:01:54
>>660
最初のモチベーションとして&を必ず付けるのが
見た目カッコ悪いってのがあったんだけど
&つけることにするよ

>>661
どちらかというとファンクタ的動作じゃなくて
boost::function的動作をさせたいんだ
664デフォルトの名無しさん:2010/02/09(火) 10:23:54
>>663
ファンクタ的動作と boost::function 的動作の違いがわからねー。
っていうか boost::function 使えって話じゃないの?
665デフォルトの名無しさん:2010/02/09(火) 10:59:46
namespace framework{ typedef void *nama_ptr; }
これが一番速い
666デフォルトの名無しさん:2010/02/09(火) 15:21:26
クラスA内の関数Aがあるとして、別の場所から関数Aが呼び出された場合と、
クラスA内から関数Aが呼び出された場合とで、関数Aの処理を分岐させたい
のですが、何か方法はありますか?
667デフォルトの名無しさん:2010/02/09(火) 15:22:31
ifステートメントを使う
668666:2010/02/09(火) 15:28:51
>>667
条件を教えてください
669デフォルトの名無しさん:2010/02/09(火) 15:30:38
呼ぶ場所に応じて異なる引数をAに渡す
670デフォルトの名無しさん:2010/02/09(火) 15:31:34
引数にパラメータを与えたり特殊化でクラスを分岐したりオーバーロードで関数を別に定義したりして
呼び出し側で条件を付与する
671デフォルトの名無しさん:2010/02/09(火) 15:38:43
教えていただきありがとうございます。
オーバーロードが使えそうなのでこれを使うことにします
672デフォルトの名無しさん:2010/02/09(火) 15:56:16
http://codepad.org/xhsizSDh

こんなのはどう?
つーか素直にpublicとprivateで関数名を変えた方がいいよね
673デフォルトの名無しさん:2010/02/09(火) 16:52:30
>>665
ベンチにかけてみ
674デフォルトの名無しさん:2010/02/09(火) 17:04:01
もう既に暖めてます
675デフォルトの名無しさん:2010/02/09(火) 17:12:04
うほっ
676デフォルトの名無しさん:2010/02/09(火) 18:45:50
static_cast<void*>(0); // いい事思いついた俺をdeleteしろ
677デフォルトの名無しさん:2010/02/09(火) 19:58:12
やねうらおのスマポってどういうの?
678デフォルトの名無しさん:2010/02/09(火) 21:03:32
delete new Hoge;
679520:2010/02/09(火) 21:59:11
誰か俺の持論に賛成意見・反論などしてくれ。

680デフォルトの名無しさん:2010/02/09(火) 22:02:11
>>679
一理ある。
681デフォルトの名無しさん:2010/02/09(火) 22:06:53
オプソなら全部英語にする。
クローズドなら対象コンパイラが読めれば何でもいい。
つまり、とくに興味ありせん。
682デフォルトの名無しさん:2010/02/09(火) 22:08:33
UTF-16でも英語Onlyにはなるな
683デフォルトの名無しさん:2010/02/09(火) 22:43:30
class Hoge
{
public:
(Hoge)(void)
{
}

/* error
inline (Hoge)(void)
{
}
*/
inline void (Fuga)(void)
{
}
};

なぜ他はコンパイルできるのに、inline(コンストラクタ)だけエラーになるんですか?
684デフォルトの名無しさん:2010/02/09(火) 22:52:08 BE:1050557257-2BP(0)
既に定義されてるからじゃないのか
685デフォルトの名無しさん:2010/02/09(火) 23:01:46
struct Hoge { inline (Hoge)(void) { } }

これでもコンパイル通らないです
686デフォルトの名無しさん:2010/02/09(火) 23:06:11 BE:1440763968-2BP(0)
http://codepad.org/1NaaFTpl
コンパイラは何だ
687デフォルトの名無しさん:2010/02/09(火) 23:07:00
VC++EE2008です
688デフォルトの名無しさん:2010/02/09(火) 23:34:51 BE:900477465-2BP(0)
わかんね
不具合じゃないかね
689デフォルトの名無しさん:2010/02/09(火) 23:36:34
C++初心者です。ご教示お願います。

環境:VC++2008 EE
OS:WindowsXP SP3

ウィンドウハンドル一覧を列挙する機能をWin32APIのEnumWinodowsで作っています。
普通に関数で作成する分にはできるのですが、学習も踏まえてクラス化したいと思っています。

しかし、コールバック関数をメンバ関数に含ませる方法がいまいちよくわかりません。
ググってもウィンドウプロシージャをクラス化する方法はあるのですが、
それをEnumWinodws関数に応用する方法がよくわかりません。

そのクラスの機能の最終目的は、ウィンドウ一覧の取得、ウィンドウハンドル等の情報を
vectorなどに格納、格納したハンドルを取り出す。等です。

ウィンドウ一覧を取得する部分さえできれば他の箇所は作れます。

簡単なコード、参考ページ等教示ねがいます。
690デフォルトの名無しさん:2010/02/09(火) 23:43:00 BE:720382346-2BP(0)
EnumWindowsの第二引数にthisをキャストして渡す。
コールバック関数で元の型に戻す。
691デフォルトの名無しさん:2010/02/09(火) 23:59:51
仮想基底の初期設定に関するルール
ttp://giftserver.dip.jp/anotherproject/html_l5/myroom/diary/2007/01/09.htm
ここも読んでみたが

俺にゃまだいまいちわからねぇ。
wっうぇうぇwww
692デフォルトの名無しさん:2010/02/10(水) 00:11:21
http://codepad.org/pkzx86x7

virtual継承はあまり使わないから詳しいことはわからんが
・virtual継承されてればサブクラスのどこからでも初期化できる
・複数で初期化されてれば一番下のサブクラスでの初期化が優先
ということかな
693デフォルトの名無しさん:2010/02/10(水) 00:15:36
>>692
それだと多重継承になってないから、
仮想継承の意味ないんじゃね?
694デフォルトの名無しさん:2010/02/10(水) 00:20:23
>>693
まあそうだけど、今は初期化子の話でしょ?
695デフォルトの名無しさん:2010/02/10(水) 00:21:00
>>694
でも多重継承じゃないと
初期化の問題は分かんなくない?
696デフォルトの名無しさん:2010/02/10(水) 00:23:17
>>695
仮想継承じゃないと
Sub2(void) : Base(2)
{
}
ここが通らないよ
確認にはなるでしょ
697691:2010/02/10(水) 00:24:16
ありがとう。
ttp://codepad.org/pK2DQc8i
多重継承に直してみたよ!
感謝!
698691:2010/02/10(水) 00:27:40
ttp://codepad.org/0dGoaFYn

こんなんでもおkなんだ。
ふーむ。

そして
ttp://codepad.org/AFW182Ps
別にSub3で明示的に呼ばなくても
勝手にBaseが呼ばれているようようだ。

・・・ああ、これが
>仮想基底のサブオブジェクトを含むオブジェクトの、最派生クラスのコンストラクタは、
>すべての仮想基底クラスの初期設定を指定しなければならない(デフォルト
>コンストラクタがある場合だけは省略してよい)。
ってやつか。
うわぁ!わかりにくいよ!!
699692:2010/02/10(水) 00:27:41
よくよく見ると間違えてるなすまん
どこでも初期化できて一番下が優先ということではないみたいね
・一番下のサブクラスでBaseを初期化しないといけない
のほうがただしいね
700デフォルトの名無しさん:2010/02/10(水) 00:28:55
>>691
分からないのは慣れてないからだと思ふ。
というかこれが理解できなくてC++を書くのは危険かと。
初期化リストっていうのは、そのクラスが持っているメンバと基底クラスのコンストラクタを
自分のコンストラクタが走る前に動かす事を記述するためのもので、
struct test : virtual base{
 inner_member a;
 test(int n) : base(n), a(n){ std::cout << "test ctor" << std::endl; }
};
test instance(111);
baseクラスのコンストラクタが走り、次にaの型であるinner_memberクラスのコンストラクタが走り、
最後に最派生クラスtestのコンストラクタtest::test(int)が走ってtest ctorと出力される。
ちなみにvirtual継承っていうのは継承関係を動的に解決する事を指定するためのもので、
urlの
1は. 通常の継承と同じ様に初期化子を記述してもよいと言っている
2は.
 仮にtestをvirtual 非virtualを問わず継承するクラスが他にあれば
 そのクラスのインスタンスにおいてtestは最派生ではないのでtestで記述された初期化子は無視されると言っている
3は.
 最派生クラスは自分が直接virtual継承を行っていなくても中間のクラスが何かvirtual継承をしていれば
 virtual継承されているそのクラスの初期化子を記述しなければいけないと言っている
通して、特に初期化子の記述がなかった場合はデフォルトコンストラクタが走る。
(これは通常の継承と共通)
そして、3において2から中間クラスのコンストラクタで記述されたvirtual継承したクラスへの初期化子は
無視されるから注意。
というか、これが分からないとC++のエラーもまともに読めないんぢゃない?
簡単なコードを読んで理解を深めるべき。
701デフォルトの名無しさん:2010/02/10(水) 00:29:02
ちなみに
ttp://codepad.org/AFW182Ps
で、デフォルトコンストラクタをコメントアウトすると

基本クラス 'Base' を初期化するデフォルトコン
ストラクタが見つからない(関数 Sub3::Sub3() )

っていうコンパイルエラーになる。
702691:2010/02/10(水) 00:33:39
>>700
分かりやすい丁寧な解説をどうもありがとう!
> test(int n) : base(n), a(n){ std::cout << "test ctor" << std::endl; }
は分かっていたつもりだったんだが
> 初期設定を指定
っていうところで意味不明になった。

> 初期設定を指定ってつまりは
初期化子リストの意味だったのね。。
703デフォルトの名無しさん:2010/02/10(水) 00:34:00
>>701
明示的にコンストラクタを1つでも記述した場合、デフォルトコンストラクタは作成されません。
704デフォルトの名無しさん:2010/02/10(水) 00:36:18
>>690 ありがとうございます

thisを使う方法は思いつきませんでした。
コールバック関数はstaticにして、
EnumWindows関数では第一引数のコールバック関数をWNDENUMPROCにキャスト、
第二引数にはthisをキャストすることでやりたいことを実現できました。

助かりましたです
705デフォルトの名無しさん:2010/02/10(水) 00:38:41
>>703
ああごめん、俺は単に横から>>691への口出し。
俺は別に知っているから大丈夫だお。
706デフォルトの名無しさん:2010/02/10(水) 01:31:38
ぐんぐんメモリが増大するんですが。
どのコードがいくつメモリ食ってるが総和を計算してくれるツールありますか。
707デフォルトの名無しさん:2010/02/10(水) 01:35:58
>>706
operation systemっていうのを使うといいらしいですよ
708706:2010/02/10(水) 02:10:16
ヒーププロファイラでできるらしいですが
linuxは動かないんです
こんなのみつけたけど

http://journal.mycom.co.jp/articles/2009/01/27/perftools/004.html
http://valgrind.org/downloads/current.html
http://www-06.ibm.com/software/jp/rational/products/purifyp/
709デフォルトの名無しさん:2010/02/10(水) 02:10:51
男はだまってタスクマネージャ
710デフォルトの名無しさん:2010/02/10(水) 02:23:58
タスクマネージャでぐんぐんあがるんで
どこかを特定したいんです
711デフォルトの名無しさん:2010/02/10(水) 03:00:59
compuwareにお布施するしかないのか…
712デフォルトの名無しさん:2010/02/10(水) 13:45:02
メモリリーク 検出 でググれば幸せになれるよ
713デフォルトの名無しさん:2010/02/10(水) 13:51:55
今スタティックライブラリを作っているのですが
例えば
boost.thread.lib
boost.shared_ptr.lib
と機能ごとにするのか
boost.lib
と全部まとめた方がいいのか
どういうふうにするのが一般的なんでしょうか?
714デフォルトの名無しさん:2010/02/10(水) 14:04:09
俺なら boost.lib ひとつにまとめる
分かれてても指定するのが面倒臭いだけでリンク時間が少し短縮するかどうかわからんくらいのメリットしかないし
715デフォルトの名無しさん:2010/02/10(水) 14:09:12
ありがとうございます
ひとつにまとめてコンパイルすることにします
716デフォルトの名無しさん:2010/02/10(水) 14:12:24
>>712
メモリリークはしてないんです
717デフォルトの名無しさん:2010/02/10(水) 14:16:36
メモリリークを検出する方法応用して
自分でモニタするシステムを作ればいいんじゃないかなということを言いたかった
718デフォルトの名無しさん:2010/02/10(水) 14:34:41
ちょっとしたクラスでcppにわけるのもめんどくさいから定義をそのままhに書きたいとします
そのときにstaticメンバを使いたい場合は下の方法は両方共安全ですか?
http://codepad.org/ufCFZ8dx
719 ◆GWRSHcLrd6 :2010/02/10(水) 17:24:51
スマートポインタにスレッドセーフな機構を追加したいのですが、
どのような時にはいた制御をおこなえばいいんですか?

削除の時ぐらいですか?
インクリメントとデクリメントの時はどうなんでしょうか?
720 ◆GWRSHcLrd6 :2010/02/10(水) 17:26:24
申し訳ないです。
はいた → 排他
721 ◆GWRSHcLrd6 :2010/02/10(水) 17:30:36
後、ロック機構はどの様な仕組みが一番高速なんでしょうか。
_Interlocked系とかですかね?(確かこれは組み込みですよね・・・?)
722デフォルトの名無しさん:2010/02/10(水) 17:38:24
どこまでやるかによるけど最終的には
あなたが実装したスマートポインタが持つ
全てのパブリックメソッドをロックしないとまずいのでは

ロックするには
cpp0xなら標準で
それ以前なら
windowsだけならCriticalSection
UnixLinuxWindowsならPOSIXのpthreadのmutex
723デフォルトの名無しさん:2010/02/10(水) 17:39:24
あぁ高速かどうかは知らないや
ベンチして報告してくれるとうれしい
724デフォルトの名無しさん:2010/02/10(水) 17:44:26
ptr_innerの変数をメソッドで隠蔽して、ロック機構をつけるとか?
そうすれば比較的簡単に差し替えられるんじゃないかなぁ

速度が気になるな

でもptr_inner::object, ptr_inner::count は変更しなければロックの必要なし?
725デフォルトの名無しさん:2010/02/10(水) 17:47:33
速度的には
Interlocked自力 < criticalsection < mutex
みたいだな
mutexが一番遅いみたいだが移植性を考えるとmutex使いたくなるが
726デフォルトの名無しさん:2010/02/10(水) 17:49:38
ビット立ててInterlock!
727 ◆GWRSHcLrd6 :2010/02/10(水) 17:51:53
自力インターロックの場合ってロックされている場合の待機は
ひたすらループを回すんですかね?
728デフォルトの名無しさん:2010/02/10(水) 17:56:24
到来した順に待機するシステム作ったり
同一スレッドからのロックなら素通りさせたり
なんてことしてたらどんどん重くなるけど
軽くしたいならスリープじゃね?
729デフォルトの名無しさん:2010/02/10(水) 18:56:59
参照カウントの増減だけなら InterlockedIncrement/Decrement で直接増減するのが一番速いと思われ
他に何かロックしたいものがあるなら別だが
弱参照とか考え出すと面倒そうだ
730デフォルトの名無しさん:2010/02/10(水) 20:19:10
custom deleterが欲しい
731デフォルトの名無しさん:2010/02/10(水) 20:20:47
だからあれだけcustom allocatorを使う事を習慣化しろと言ったのだ
732デフォルトの名無しさん:2010/02/10(水) 20:42:40 BE:540287036-2BP(0)
std::list のアロケータって何で指定できるんだっけ
733デフォルトの名無しさん:2010/02/10(水) 20:47:20
>>732
3番目のデフォルト引数
734デフォルトの名無しさん:2010/02/10(水) 20:51:40
template <class T, class Allocator = allocator<T> >
class list;

2番目じゃね?
735 ◆GWRSHcLrd6 :2010/02/10(水) 20:58:57
http://cdtest.genin.jp/projects/smart_ptr/index.htm

修正してうpしました。

>>622さんのをちょいと拝借してテストモジュールを書いてみました。
インターロック実装はまだです。

>>730
custom deleterは関数オブジェクトを渡せるはずです。さらにカスタムなら
ptr_innerを改造するとか。なんか取り違えていたらごめんなさい m(_ _)m

>>731
custom allocatorってどういうのなんですか?
よく知らなくて orz
736デフォルトの名無しさん:2010/02/10(水) 21:00:54 BE:840445474-2BP(0)
>>733,734
HowじゃなくてWhyだぜ
737デフォルトの名無しさん:2010/02/10(水) 21:06:44
Whyか

まず<memory>ヘッダを熟読する事

boost::poolなどを入れて実験すると良い
738デフォルトの名無しさん:2010/02/10(水) 21:13:38 BE:900477465-2BP(0)
std::listじゃ使用されなくね?
739デフォルトの名無しさん:2010/02/10(水) 21:14:45
使用されるだろ。
何考えてるんだ。
740デフォルトの名無しさん:2010/02/10(水) 21:15:19
ん?
std::construct()
std::destruct()
などは普通に使用してると思うが
741デフォルトの名無しさん:2010/02/10(水) 21:17:10
連続空間を要請されないだけでひとつひとつallocate/deallocateつ勝てるよ
742デフォルトの名無しさん:2010/02/10(水) 21:17:49 BE:2161145489-2BP(0)
まじか
ずっと使用されないものだと思ってたわ。
長年の疑問が解けた。

ありがとう
743デフォルトの名無しさん:2010/02/10(水) 21:22:18
boost::shared_ptrのベンチマーク
計算中...
単純な生成ループ: 287
空ポインタに代入: 344
オブジェクトのリセット: 730
オブジェクトのコピー: 675
オブジェクトの解放: 311

framework::smart_ptrのベンチマーク
計算中...
単純な生成ループ: 246
空ポインタに代入: 241
オブジェクトのリセット: 496
オブジェクトのコピー: 480
オブジェクトの解放: 240

トータルスコア:
boost::shared_ptr: 2347
framework::smart_ptr: 1703

boost::shared_ptrに対する性能
単純な生成ループ: 116.7%
空ポインタに代入: 142.7%
オブジェクトのリセット: 147.2%
オブジェクトのコピー: 140.6%
オブジェクトの解放: 129.6%

全体: 137.8%
744デフォルトの名無しさん:2010/02/10(水) 21:26:40
俺もboost::poolを標準で提供されているアロケータとすげ替えて
実験してみたが、そう速くはならなかった

標準のアロケータで十分にチューニングされているようだ
745デフォルトの名無しさん:2010/02/10(水) 21:28:28
fast使えよ
746デフォルトの名無しさん:2010/02/10(水) 21:30:35
smart_ptr/ptr_detail.hpp(32) : warning C4100: 'p' : 引数は関数の本体部で 1 度も参照されません。

型名だけ書いて変数名省略しようぜ
747デフォルトの名無しさん:2010/02/10(水) 21:32:47
http://boost.cppll.jp/HEAD/libs/pool/doc/interfaces/pool_alloc.html

>もし、パフォーマンスを真剣に考えているなら、std::list のようなコンテナを
>扱うときは fast_pool_allocator を、std::vector のようなコンテナを扱うときは
>pool_allocator を使うとよい。

うーむなかなか奥が深いな
748デフォルトの名無しさん:2010/02/10(水) 21:35:40
別にそんなに深くない。
連続領域かそうでないかで場合分けしてるだけ。
749デフォルトの名無しさん:2010/02/10(水) 21:38:26 BE:540287429-2BP(0)
http://www.geocities.jp/ky_webid/cpp/library/028.html

ここには、std::listがアロケータをほとんど使わないと書いてあるんだが間違い?
750デフォルトの名無しさん:2010/02/10(水) 21:38:41
>>743
不要なnullチェックを省いたのか
意外と速くなるもんだな
751デフォルトの名無しさん:2010/02/10(水) 21:38:56
奥が深い症候群に罹ってます
お薬出しておきますね
つ タミフル
752デフォルトの名無しさん:2010/02/10(水) 21:40:36
C++ってどんどん肥大化して初心者に嫌われる言語になっていってるよね
753デフォルトの名無しさん:2010/02/10(水) 21:41:00
>>749
vectorでは再度アロケートし直すからそれと比べて
listは要素をアロケートし直す動作を隠蔽する必要がないって言ってるんじゃない?
そもそも、「殆ど使わない」は「全く使わない」ではないからある程度使うし、vectorの使用回数が異常なだけ。
754デフォルトの名無しさん:2010/02/10(水) 21:42:02
テスターが良くできている
755デフォルトの名無しさん:2010/02/10(水) 21:43:55
>>752
そんな事は単純に言えないのでわ?
複雑な部分はユーザーから見えない部分に隔離して
表面的には簡単に見えるように努力していると思う

ただしストリームの多重継承とかマニピュレータとか
std::stringのメンバ関数の多さとか、問題があるなあ
と思える部分があるのは仕方が無い
756デフォルトの名無しさん:2010/02/10(水) 21:50:10
初心者に嫌われてるかなぁ・・・。
これこそちょっとC++齧って俺TSUEEEEしてるスクリプトキディが言いそうな事に思えるけど。
肥大化とか仕様が膨大とか言ってるけど
言語の計算機科学的側面から性質やコンパイル時の効率と整合性、
実行速度と記述の方法を照らし合わせて最もベターな方法を取った部分など
基本形が分かっていれば仕様なんて参照しなくても容易に予測できて
理にも適ってるところが多いと思うけど。
あんまり適当な事ばかり言ってスレを荒らさない方が良いよ。
こんな議論もう10年以上前に決着が付いてるんだし。
757デフォルトの名無しさん:2010/02/10(水) 21:51:17
D&Eを読めって事だな
あれを読むとぐぅの音も出なくなる
758デフォルトの名無しさん:2010/02/10(水) 21:53:08
>>752
なんか>>756さんがすげぇ書いてくれているけど、
初心者が嫌うというより、バカには使えない言語になっている
だけだと思うんだけど。

759758:2010/02/10(水) 21:53:51
>>756
>こんな議論もう10年以上前に決着が付いてるんだし。
C++0xが10年以上前にはまさかこんな仕様になると
思っていたの?
760デフォルトの名無しさん:2010/02/10(水) 21:53:52
逆に、初心者に大人気!…ってのも笑うしかないくらい意味不明だしなあ
761デフォルトの名無しさん:2010/02/10(水) 21:54:25
>>749
listでもなんでも指定したアロケータが使われる。
そのためにrebindがあって、list<T>ではallocator<T>が使われるという保証はないけど、
別の型Uに対するallocator<U>という形で、指定したアロケータが使われることに変わりはない。
762デフォルトの名無しさん:2010/02/10(水) 21:56:00
実際C++をdisってるのって1ファイルがたったの1000しかなくても
「読めない」「長すぎ」「typenameって何だよ気持ち悪い」
「BOOST_PP_〜ってなに?」「ポインタと参照の区別が付かない」
とか言ってる碌に動作を調べもしない馬鹿ばっかりだからな。
本当にD&Eくらい読めと言いたくなる。
763749:2010/02/10(水) 21:57:22 BE:1050556875-2BP(0)
そういうことか。
サンクス
764デフォルトの名無しさん:2010/02/10(水) 21:59:04
まあねぇ。
バカには使えない言語になっているってのは
ある意味いいことでもある。
765デフォルトの名無しさん:2010/02/10(水) 22:00:09
>>759
0xじゃなくて現行仕様の話をしてるんだよ。
766758:2010/02/10(水) 22:00:32
>>762
> 「typenameって何だよ気持ち悪い」
ちょっと同意ww
> 「BOOST_PP_〜ってなに?」
これはともかく
> 「ポインタと参照の区別が付かない」
こんなやつ居るの!?
C++とかいう問題じゃなくて、他の言語も出来ないだろそれじゃ。
767デフォルトの名無しさん:2010/02/10(水) 22:01:48
C++はライブラリがいまいち
768デフォルトの名無しさん:2010/02/10(水) 22:03:05
> なんか>>756さんがすげぇ書いてくれているけど、
> 実際C++をdisってるのって

こんな書き方をするのって柄の悪い若者ばかりだよね。
頭の悪いというよりは、頭も悪くて自己防衛と称して他者に考え方を押し付ける人間だと思う。
これじゃ体育会系が根性論振り回してるだけ。
769デフォルトの名無しさん:2010/02/10(水) 22:03:30
>>767
Boost
Loki
Qt他
じゃ不満?

外部のライブラリはC言語用かC++言語用が多くね?
770デフォルトの名無しさん:2010/02/10(水) 22:04:15
>>767
それはCも同じじゃないか?
まだSTLがある事を喜べよ
ポトペタが好きならC#かC++Builder使えばいいし
771デフォルトの名無しさん:2010/02/10(水) 22:04:31 BE:1470779677-2BP(0)
BoostとATL/WTLがあれば私は幸せです
772デフォルトの名無しさん:2010/02/10(水) 22:04:49
なんか荒れてきたなw

C++が好きだろうが嫌いだろうが関係ない。
スレタイに沿わない話は全て止めろ!
773デフォルトの名無しさん:2010/02/10(水) 22:04:52
ATLはウンコ
774デフォルトの名無しさん:2010/02/10(水) 22:08:13
>>768
中身を見ないで外見だけで判断する老害
775デフォルトの名無しさん:2010/02/10(水) 22:09:48
Cとか眼中にないから
776デフォルトの名無しさん:2010/02/10(水) 22:10:03
out of 眼球
777デフォルトの名無しさん:2010/02/10(水) 22:10:49
水晶体以外はみんなそうさ
778デフォルトの名無しさん:2010/02/10(水) 22:12:10
QtがLGPLになる前はどうしてたん?
779デフォルトの名無しさん:2010/02/10(水) 22:30:30
Qtはポトペタか
面白いな

SM PlayerがQtで作られているのを知って驚いた
780デフォルトの名無しさん:2010/02/10(水) 22:37:37
Qtはmocとか変な拡張しているからなあ
781デフォルトの名無しさん:2010/02/10(水) 22:43:55
うわぁ・・・
mocについて調べてみたけどプラットフォームを共通化するために
随分と苦労しているような印象を受ける

事実上のMotifの後継規格っぽいな

この辺はC++Builderの方がシンプルか
その代わり他の開発環境では動かないけど
782デフォルトの名無しさん:2010/02/10(水) 22:53:36
mocすげぇよな。
いったいどうやってんだか。。。
783デフォルトの名無しさん:2010/02/10(水) 22:55:52
moc使う前のコードは共通化して、moc通したコードが
プラットフォーム事に違う物(かつ最適な物)を吐くようになってるんだろうな
784デフォルトの名無しさん:2010/02/10(水) 22:59:02
public slots :
だっけ?
最後はこのslotsとかは削除されてコンパイラに渡されるんだよね。

>>780
しかしQxxxというクラスに依存してQtを使っていれば
どうせ環境依存・・・じゃなくてQt依存になるわけだからいいのでは?
785デフォルトの名無しさん:2010/02/10(水) 23:16:38
>>735
お!なかなかいいスコアーが出てますな。

*shared_ptrはスレッドセーフの時
トータルスコア:
boost::shared_ptr: 527
framework::smart_ptr: 515

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

全体: 102.3%

*shared_ptrは非スレッドセーフ時(BOOST_SP_DISABLE_THREADS時)

トータルスコア:
boost::shared_ptr: 502
framework::smart_ptr: 521

boost::shared_ptrに対する性能
単純な生成ループ: 97.3%
空ポインタに代入: 94.7%
オブジェクトのリセット: 94.1%
オブジェクトのコピー: 97.9%
オブジェクトの解放: 98.6%

全体: 96.4%
786デフォルトの名無しさん:2010/02/10(水) 23:17:42
mocみたいなのが必要なのは
C++の機能が足りない証拠
C++はもっと機能を増やすべきだ
787デフォルトの名無しさん:2010/02/10(水) 23:19:26
Qtで使われてるだけで必要とは言えないだろうに
788デフォルトの名無しさん:2010/02/10(水) 23:20:19
VCLも独自拡張している
789デフォルトの名無しさん:2010/02/10(水) 23:22:49
>>735
inlineとかthisとか書かなくてもいい部分は省略したほうが読みやすくないかな?
790デフォルトの名無しさん:2010/02/10(水) 23:23:43
もっともC++Builderの独自拡張のほとんどはDelphiサポートなんだけどな
要するにVCLはそのまま使い、言語の方を変える事によって手抜きしたわけだ

VCLがC++で書いてあったらと何回思ったか分からない
791デフォルトの名無しさん:2010/02/10(水) 23:32:33
これ以上はスレ違いになるが、__published: なんかはポトペタ環境を
サポートするために必要な予約語だ

メタコンパイラが嫌ならC++/Qtみたいな言語を作ればいいだろうが
恐らく歓迎はされないだろうな
792デフォルトの名無しさん:2010/02/10(水) 23:34:04
mocが無ければQt使ってたんだけどなあ・・・せっかくLGPLになったのに勿体無い
793デフォルトの名無しさん:2010/02/10(水) 23:34:37
makeで勝手にやらせようず
794デフォルトの名無しさん:2010/02/10(水) 23:35:44
>>792
> mocが無ければQt使ってたんだけどなあ・・・せっかくLGPLになったのに勿体無い
だからQxxxというクラスに依存してQtを使っていれば
どうせ環境依存・・・じゃなくてQt依存になるわけだからいいのでは?
795デフォルトの名無しさん:2010/02/10(水) 23:47:21
環境依存ならmocなし書けるのかな
796デフォルトの名無しさん:2010/02/10(水) 23:48:34
>>795
いやmocは別に環境依存を解消しているわけじゃ
ないんだぞ?
している面もあるのかもしれんけど、
mocって何の略だか考えて見れば。。。
797デフォルトの名無しさん:2010/02/11(木) 00:41:24
>>785
何がオーバーヘッドなんだろうなぁ
Free()の呼び出しとか?
798デフォルトの名無しさん:2010/02/11(木) 00:52:38
>>797
Decでcount==0は冗長じゃないかな?
799デフォルトの名無しさん:2010/02/11(木) 00:54:22
wxWidgets がアップを始めたようです
800 ◆GWRSHcLrd6 :2010/02/11(木) 11:24:01
>>799
ptr_innerにはメモリプールを使うことも考えたのですが・・・
管理が大変なんですよね
801 ◆GWRSHcLrd6 :2010/02/11(木) 11:26:28
アンカーミスです
すいません
>>797
802デフォルトの名無しさん:2010/02/11(木) 11:51:01
・演算コストが高い
・考えるのが面倒

どれ?
803 ◆GWRSHcLrd6 :2010/02/11(木) 11:54:22
前者で・・・
804デフォルトの名無しさん:2010/02/11(木) 11:59:11
計算コストが高いのに使うことを考えたの?それとも実際に評価したの?
評価してなくて早くなる気がしてるのに実装しないなら後者だよね

とか言われそうだけど仕事じゃないんだからゆっくりやればいいよ
805デフォルトの名無しさん:2010/02/11(木) 12:03:01
コストが高くてもそれが全体に寄与する効果がそれ以上に高ければ
言い換えるならばメモリ管理のそのコストが必要な実装において最小なら
その実装は必要
806 ◆GWRSHcLrd6 :2010/02/11(木) 12:51:19
大量のスマートポインタが参照を保持している場合、メモリプールの
領域管理が大変なコストになりそうで。
どの領域が使用されているのか、そのチェックが大きなオーバーヘッドに
なる気がするんですよね。

コストを減らそうと一度に多くとる・・・ってだけじゃ
コンスタントにメモリを喰うわけですし。
807 ◆GWRSHcLrd6 :2010/02/11(木) 13:21:43
まあ、メモリプールの話は置いといて、
高速化、マルチスレッド化を図りたいと思います。
808デフォルトの名無しさん:2010/02/11(木) 13:40:50
プールが役に立つのは限定された場合だけだから、マルチスレッド化を先に図るのは適切だと思うよ。
809 ◆GWRSHcLrd6 :2010/02/11(木) 13:48:01
Getメソッドの時はロックの必要はありませんよね?
810デフォルトの名無しさん:2010/02/11(木) 13:57:56
大体どこにロックの必要があるんだ?
説明してくれ
811デフォルトの名無しさん:2010/02/11(木) 13:58:41
メモリプールするのは、Googleのやつでいい。 tcmallocとかいうの
812デフォルトの名無しさん:2010/02/11(木) 14:02:32
Getしてる最中にどっかからSetされたらどうするんだ
マルチスレッドではロックは常にいる
813デフォルトの名無しさん:2010/02/11(木) 14:07:52
getが処理中間状態を採る可能性がなけりゃ
必要とは言い切れんよ
814デフォルトの名無しさん:2010/02/11(木) 14:09:39
まあそうだな
アトミック性の保証と言った方がいいか

intやポインタ1個だからって中間状態がないとは言い切れないからな
815デフォルトの名無しさん:2010/02/11(木) 14:18:25
smart_ptrをスレッドセーフにしたいの?
格納するポインタの動作をスレッドセーフにしたいの?
前者ならget時には要らない
816デフォルトの名無しさん:2010/02/11(木) 14:20:39
>>812
どこへのセット?
スマポが参照するオブジェクトをスレッド間で共有するのが目的で、スマポそのものを共有する訳ではないから一つのスマポそのものへの同時アクセス保護は不要でしょう。
内部カウンタについてもカウンタは共有されるからアトミック操作は必要だけど、ほかのメンバーは初期化後に変更されないでしょうし。

817デフォルトの名無しさん:2010/02/11(木) 14:24:40
コンパイルオプションにマルチスレッドを検出したら#errorする#ifdefを書けばいい
818デフォルトの名無しさん:2010/02/11(木) 14:50:03
ASCII文字列を大文字に変換して比較するときって

tolowerで1文字ずつ変換しつつ比較するしか
ないですよね?

一度にわさっと比較する方法ないですよね?
819デフォルトの名無しさん:2010/02/11(木) 14:53:15
ないです
820デフォルトの名無しさん:2010/02/11(木) 14:54:27
>>818
4文字分の変換テーブル
821デフォルトの名無しさん:2010/02/11(木) 14:54:33
入力が小文字しかないなら'z'を文字列の長さだけ敷き詰めて
ベクタな減算とか'A'へのベクタな加算とかいろいろしてわさっとできる。
822デフォルトの名無しさん:2010/02/11(木) 14:58:22
文字を大文字にしてしまっていいなら
string word;
//
//gcc(VCならtoupperの型が違うので関数オブジェクトを作る)
transform(word.begin(),word.end(),word.begin(),toupper);
//で変換して
if(word < word2)
823デフォルトの名無しさん:2010/02/11(木) 15:04:12
>>822
stringなんて作ったらそれだけで遅い
意味ないこと書かないでくれよ
824デフォルトの名無しさん:2010/02/11(木) 15:07:29
Boehm GCに速度で負けたら使う意味ないがな。
これはGC_mallocで確保した物を自動開放するやつだが
スマートポインタと機能は同じだろ。
歴史が長く使いこなされてるから、これよりパフォーマンス上がらないとこっち使えばいい。
825デフォルトの名無しさん:2010/02/11(木) 15:08:00
質問者にあわせた無難な例示に見えるが
826デフォルトの名無しさん:2010/02/11(木) 15:10:23
#define malloc GC_malloc
などと定義すれば、すべての動的確保を自動化できる。
全自動したとき、Boehm GCより速度が上がるなら使う。
827デフォルトの名無しさん:2010/02/11(木) 15:14:30
動的メモリを多用するソフトで明示的なfree、deleteを外して
組み込んで、ピークメモリと実行速度を比較してくれよ。
828デフォルトの名無しさん:2010/02/11(木) 15:20:48
EffectiveC++によるとクロスDLL問題なるものがあるらしい
スマートポインタはカスタムデリータが指定できるから大丈夫だそうだが
カスタムデリータを指定せずにスマポを使ったら
メモリが破棄されなかったりする?
829デフォルトの名無しさん:2010/02/11(木) 15:21:20
std::*streamから零終端文字列に変換してc_func(const char *)に渡す最も効率のいい方法はどんな方法ですか?

バイナリモードだったら動的配列にreadすればいいんですが
テキストモードだとreadが使えないので困ってます
830デフォルトの名無しさん:2010/02/11(木) 15:32:12
Boehm GCはスレッドセーフだっけ?
831デフォルトの名無しさん:2010/02/11(木) 15:39:38
832デフォルトの名無しさん:2010/02/11(木) 15:43:03
>>829
効率のいい方法より、確実に動かすことを考えたら
833デフォルトの名無しさん:2010/02/11(木) 15:43:48
Boehm GCreadme

The allocator/collector can also be configured for thread-safe operation.
(Full signal safety can also be achieved, but only at the cost of two system
calls per malloc, which is usually unacceptable.)

アロケータ/コレクタは、スレッドセーフな操作用に構成することができます。
完全な信号の安全性も、2つのシステムのコストだけで達成することができます
malloc関数あたりは、通常は許容されませんコール。
834デフォルトの名無しさん:2010/02/11(木) 15:43:55
>>829
書いてみたけど
テキストモードという前提があるからistream_buf使えないからあんまり効率よく書けないなぁ
#include<istream>
#include<string>
#include<iterator>
std::string to_string(std::istream&input){
    input.unsetf(std::ios::skipws);
    return std::string(std::istream_iterator<char>(input),std::istream_iterator<char>());
}
#include<istream>
#include<string>
std::string to_string(std::istream&input){
    std::string line;
    std::getline(input,line,'\0');
    return line;
}
835デフォルトの名無しさん:2010/02/11(木) 15:44:12
>>814
レジスタ1つに入るレベルだから中間状態はないだろう
836デフォルトの名無しさん:2010/02/11(木) 15:46:55
>>828
破壊されない。
newした側でshared_ptrに渡せばnewした側のランタイムのデリータが呼ばれる。

837デフォルトの名無しさん:2010/02/11(木) 15:53:16
>>826
君は、Boehm GC使ってるの?
838デフォルトの名無しさん:2010/02/11(木) 15:57:04
頻繁に使わないが、使えるようになっている。
boost使うくらいなら、こっちを使う。
boostの頻繁な更新とスマートポインタの変化をチェックするのは面倒。
あと重いし、スマートポインタだけ分離できない。手を加えればいけると思うけど面倒。
839デフォルトの名無しさん:2010/02/11(木) 16:04:28
2009-06-11 Hans Boehm
win32_threads.c (MAX_THREADS): Define as 1 if GC_win32_dll_threads
is defined as FALSE (otherwise the size of dll_thread_table is near 200 KiB for 32-bit).
840デフォルトの名無しさん:2010/02/11(木) 16:23:54
841デフォルトの名無しさん:2010/02/11(木) 16:50:38
>>838
STLとの相性はどう?
>>831
速いのか遅いのかよく分りません
842 ◆GWRSHcLrd6 :2010/02/11(木) 17:02:10
待機のためにsleepを使いたいのですがVCにはsleepがなく、unixにはSleepがないんですよね・・・
#defineしか無いのでしょうか?
843デフォルトの名無しさん:2010/02/11(木) 17:04:17
>>842
スマポにsleepはいらないと思うよ。
スマポはアトミックオペレーションで実装できると思うよ。
844デフォルトの名無しさん:2010/02/11(木) 17:13:40
doubleの中に、プラスゼロとマイナスゼロのどちらが代入されているか、
調べる簡単な方法はありますか?
char[100] str;
sprintf(str, "%e", a);
としてdouble aの値を書いておいて、先頭が'-'かどうかを調べるのは思いついたのですが、
通常はどうやるんでしょうか。
845デフォルトの名無しさん:2010/02/11(木) 17:17:52
a==0.0?plus:a==-0.0?minus:other;
846デフォルトの名無しさん:2010/02/11(木) 17:20:18
アトミックオペレーションはCPU依存じゃないの?
847デフォルトの名無しさん:2010/02/11(木) 17:27:36
http://ja.wikipedia.org/wiki/%E4%B8%8D%E5%8F%AF%E5%88%86%E6%93%8D%E4%BD%9C
CPU依存するみたいだけど
これが出来ないような環境はマルチスレッド推奨じゃないと思っていいんじゃないかな
848デフォルトの名無しさん:2010/02/11(木) 17:36:50
あるスレで貼り付けられていたのをコピペしてみる。



コメントは // と /* */ とからなりますが、厳密にはC++言語は次の様なコメントの扱いをします。

1. //でコメント導入を示し、行末までがコメントになります。

 var = 42; // comment

2. /*と*/で囲むと、複数行コメントになります。

 /*comment*/
 aaaコメントでない
 /*comment
  comment
  comment
  */

3. コメントの入れ子については
C++言語では基本的に前から見ていくので、最初に出現したコメントが優先されます。
(//を無条件で優先するというようなことはありません。)

従って
 /* foo // bar */
 foobar */
は最初の/*を見た瞬間から*/が出現しない限り全て無視する(コメント扱いする)こととなります。
よってC++言語では//を見ても何とも思わずコメント扱いを続け、
その後最初に */を見た瞬間にコメント扱いを終了します。
よって foobar までコメントになるのでははなく、
/* foo // bar */だけがコメントとなりfoobar */の部分はコメントでないことにとなります。
849デフォルトの名無しさん:2010/02/11(木) 17:37:39
4. 文字列リテラルの扱い
C++言語では "" で挟まれた物を文字列として扱います。
"コメントでない"//comment

5. コメントと文字列の入れ子について
C++言語では3.と同様に、最初に出現したものを優先します。

#############C++言語 コメント&文字列の扱いの例#############

// comment /*
foo コメントでない
// comment */

foo /*
comment
// comment */

// comment /*
foo コメントでない
foo */ これはコメントでない

"// foo" コメントでない

// "comment" コメントである
/* "comment" コメントである
 comment
// comment */

foo コメントでない
"/*" コメントでない
foo コメントでない
// comment */
850デフォルトの名無しさん:2010/02/11(木) 17:39:03
C++言語 コメント&文字列の扱いの例
ttp://codepad.org/PMJ0Om1O

こっちのがずっと見やすいな。
851 ◆GWRSHcLrd6 :2010/02/11(木) 17:40:39
>>843
アトミックオペレーションを保証するためのlock関数みたいのはあるんでしょうか?
インクリメントだけでなく、内部ポインタに入る前に他のスマートポインタからの操作を
ロックしたいのですが。

void AddRef()
{
  lock();
  inner->Increment();
  // 前後にロックしていなかったらIncrementに入った直後に
  // 無くなっているかもしれない(推論)
  unlock();
}

勘違いですかね?
852デフォルトの名無しさん:2010/02/11(木) 17:45:19 BE:450238853-2BP(0)
これ思い出した

int is_cpp()
{
return 1 //**/ 2
;
}
853デフォルトの名無しさん:2010/02/11(木) 17:46:06
>>851
スマポの複製をするときは、そのスレッドは最低1個のスマポを掴んでいるから開放されることは無いと思うよ。
854デフォルトの名無しさん:2010/02/11(木) 17:57:35

smart_ptr<int> p;

int main()
{
  { p = new_ptr(new int(0)); }
  do_work(thread1);
  do_work(thread2); 
  return 0;
}

void thread1()
{
  smart_ptr p2 = p; // p2.Copy(p);
  if (p) p->Invoke();
}

void thread2()
{
  p.Free();
}
855デフォルトの名無しさん:2010/02/11(木) 18:01:56
>>854

ケース1: エラー無し

thread1 --Copy---------Invoke---------------
thread2 -------Free-------------------------
innerの寿命 ------------------------------------
カウント 1----21----------------------------

ケース2: エラー無し(Invoke不可)

thread1 ----Copy---------Invoke(NULL)-------
thread2 Free--------------------------------
innerの寿命 ------------------------------------
カウント 1--0--------------------------------

ケース3: E N D

thread1 ------Copy--Invoke(Invalid Address)-
thread2 ----Free----------------------------
innerの寿命 ------------------------------------
カウント 1------0-?--------------------------

こうなる
856デフォルトの名無しさん:2010/02/11(木) 18:02:49
>>841
http://qqqppp.net23.net/BoehmGCwin32.zip

バリナリ上げとく。
全てのメモリ管理を置き換えるわけではなく
STLだけ標準にも出来る。
GC_mallocを使ったときだけ、ガベージコレクション発動する。
857デフォルトの名無しさん:2010/02/11(木) 18:20:29
/*/ ってどうなるんだっけ?

昔これを書いてる奴がいて、よっぽど M か
トンチ好きなんだなと思った記憶がある。
858デフォルトの名無しさん:2010/02/11(木) 18:22:21
C++書いてるのにトークン分け規則が頭に入ってないなんて格好良過ぎる
859デフォルトの名無しさん:2010/02/11(木) 18:45:43
>>854
せっかく複数のスマポ間でオブジェクトの共有をできるようにしてるのに、スマポ本体をスレッド間で共有する必要はなくないか。
スレッドごとにスマポを作った上で一つのオブジェクトをスマポで共有すればいいんでしょう。
860デフォルトの名無しさん:2010/02/11(木) 19:07:08
>>859

もうここまでくるとスレッドセーフに設計する必要ない気がする
エラーになるケースが思いつかん

みんなの意見をオラにくれ
861デフォルトの名無しさん:2010/02/11(木) 19:32:25
>>860
共有するならスレッドセーフにしないと共有されてるカウンタのInc/Decができないから必要だわ。
862デフォルトの名無しさん:2010/02/11(木) 19:34:30
bufという中身に「0,あいうえお,1,2,」
という文字列を配列に格納したい場合の質問です

int a,b,c;
char d[10];
sscanf_s(buf,"%d,%s,%d,%d,",%a, %d, sizeof(d), &b, &c);

と書いているんですがdにうまく「あいうえお」と収納できません。
どこが間違っていますか?
dに「あいうえお,1,2,」と収納されてしまいます
863862:2010/02/11(木) 19:36:01
すいません
sscanf_s(buf,"%d,%s,%d,%d,",%a, d, sizeof(d), &b, &c);
の間違いでした。
この状態だと動きませんので教えてください。
864デフォルトの名無しさん:2010/02/11(木) 19:36:27
普通に作る場合、スマポだからとかは関係なしに
共有リソースをアクセスするときには排他処理を入れると思う
865デフォルトの名無しさん:2010/02/11(木) 19:39:28
C++というよりVC++で使えるリジュームダウンロードを行える関数はありますでしょうか?
866デフォルトの名無しさん:2010/02/11(木) 19:39:35 BE:600318645-2BP(0)
>>863
まだ間違ってね?
867デフォルトの名無しさん:2010/02/11(木) 19:53:18
スマートポインタの使い方についてなのですが、
ポインタaをshared_ptrなどに格納した後このshared_ptrには触れず、
処理は生のポインタaを介して行う…というのは行うべきではありませんか?
868デフォルトの名無しさん:2010/02/11(木) 19:58:37
もし生ポインタがdeleteされたら二重にdeleteされるかもしれないので
インタフェースの関係で仕方ない場合はあるが
基本的にはやるべきじゃない
何のためにshared_ptrを使ってるのかって話になる
869デフォルトの名無しさん:2010/02/11(木) 20:04:20
GCのほうが参照が無くなったら直ちに解放しない分速いのか。
スマートポインタは直ちに回収するんだろ。
GCは1秒や5秒ごとでもいいはず。
870デフォルトの名無しさん:2010/02/11(木) 20:05:28
>868
ありがとうございました。
クラスのメンバをスマートポインタ型などで宣言するのに抵抗があるもので…
871デフォルトの名無しさん:2010/02/11(木) 20:08:30
>>870
> クラスのメンバをスマートポインタ型などで宣言するのに抵抗があるもので…
( ゚д゚)
(つд⊂)ゴシゴシ
(;゚д゚)
(つд⊂)ゴシゴシ
(゚Д゚≡゚д゚)エッ!?

基礎中の基礎だぞ?
872デフォルトの名無しさん:2010/02/11(木) 20:11:40
俺はコピコンを乱用するようなコンテナくらいでしかスマポは使わないわ
クラスメンバのポインタとか裸んぼさん
873デフォルトの名無しさん:2010/02/11(木) 20:11:59
Boehm GCの特徴

マーク・アンド・スイープ - Wikipedia

この方式は、参照カウントにおける問題を回避し、
不要なオブジェクトを確実に破棄できる。
また、参照カウントを使わない分、
ガベージコレクタが動作していない間の処理は高速である。

反面、ガベージコレクタ自体は、参照カウント方式より処理時間がかかるため、
参照カウントによるごみ集めと併用されることがある。
いくつかのシステムでは、参照カウントによるごみ集めを常に行い、
マークアンドスイープは、次のような適当なタイミングを見計らって時々行う。

メモリが不足してきたとき
システムが何もしていないとき
プログラムから明示的な指令があったとき
874デフォルトの名無しさん:2010/02/11(木) 20:13:51
>>871
その書き方だとしちゃいけないみたいに読めるぞw
875デフォルトの名無しさん:2010/02/11(木) 20:16:09
「とりあえずスマポ」
これは初心者にありがち
876デフォルトの名無しさん:2010/02/11(木) 20:19:13
回収がいつになるか決まらず、デストラクタが遅れることがあるらしい。
これは不便。デストラクタをもつクラスにはつかえんな。




Python - Wikipedia
マーク・アンド・スイープ方式のみに頼っている言語では、
オブジェクトがいつ回収されるか保証されないので、
ファイルのクローズなどをデストラクタに任せることができない。
CPythonは参照カウント方式を併用することで、循環参照が発生しない限り、
オブジェクトはスコープアウトした時点で必ずデストラクトされることを保証している。
JythonおよびIronPythonではマーク・アンド・スイープ方式を採用しているため
スコープアウトした時点で必ずデストラクトされることが前提のコードだと
JythonやIronPythonでは正しく動かない。
877デフォルトの名無しさん:2010/02/11(木) 20:22:30
>スコープアウトした時点で必ずデストラクトされることが前提のコードだと
>JythonやIronPythonでは正しく動かない。
自分のプログラムに関係ないところで悩まされるのは嫌だなあ・・
878デフォルトの名無しさん:2010/02/11(木) 20:22:41
回収に時間差があっても取り残さず消されるだけでも使えるけど。
参照消滅と同時だと、頻繁に回収が起こりパフォーマンスが落ちるし。
879デフォルトの名無しさん:2010/02/11(木) 20:24:49
消滅が頻繁に起こってそれが問題になるならメモリプール使えばいい
880デフォルトの名無しさん:2010/02/11(木) 20:27:12
>>877
クラスは自動変数か明示的な動的確保して
クラス内でガベージコレクション使って動的確保したら、デストラクタは動作する。
なのでたいした問題ではない。
881デフォルトの名無しさん:2010/02/11(木) 20:54:51
>>861
>共有するならスレッドセーフにしないと共有されてるカウンタのInc/Decができないから必要だわ。

なぜ?
882デフォルトの名無しさん:2010/02/11(木) 21:12:40
>>877
いつデストラクトされるか分らないなんて、確かに困るよな。
大量のバッチ処理時なんかに、ファイルのオブジェクトがいつまでも残ってクローズされて共有違反になるとか非常に困る。

883デフォルトの名無しさん:2010/02/11(木) 21:22:42
bufという中身に「0,あいうえお,1,2,」
という文字列を配列に格納したい場合の質問です

int a,b,c;
char d[10];
sscanf_s(buf,"%d,%s,%d,%d,", %a, d, sizeof(d), &b, &c);

と書いているんですがdにうまく「あいうえお」と収納できません。
どこが間違っていますか?
dに「あいうえお,1,2,」と収納されてしまいます
884デフォルトの名無しさん:2010/02/11(木) 21:29:48
%a
885デフォルトの名無しさん:2010/02/11(木) 21:33:33
>>883
%a というのは正しいのですか?
886863:2010/02/11(木) 21:34:44
>>884 そこも違ってたようです
でもこれだけが原因の様じゃないようです
887デフォルトの名無しさん:2010/02/11(木) 21:40:47
>>881
確かに必要な気がしなくなってきた
888デフォルトの名無しさん:2010/02/11(木) 21:43:06
sscanf_s(buf,"%d,%10c,%d,%d,", %a, d, &b, &c);
889883:2010/02/11(木) 22:00:04
>>888
その方法だと「0,あいうえおかきくけこ,1,2,」とかだと対応しないですよね
外部ファイルを読み込むのが想定なので・・・
890883:2010/02/11(木) 22:01:49
そもそもchar[10]と例ではなってるので5文字以上ははいらないか
1〜4文字だった場合は失敗するのでそういう方法以外でお願いします
891デフォルトの名無しさん:2010/02/11(木) 22:05:51
for (p = buf, *p; ++p) if (*p == ',') *p = ' ';
sscanf_s(buf,"%d %s %d %d ", %a, d, &b, &c);
892デフォルトの名無しさん:2010/02/11(木) 22:25:11
sscanf_s(buf, "%d,%[^,],%d,%d", &a, d, sizeof(d), &b, &c);
893883:2010/02/11(木) 22:31:05
891のソースはコンパイル通らなかったので
多分「,」ではなくスペースで区切って処理をしろって事ですよね

892のソースはそのまま動きましたありがとうございます
894デフォルトの名無しさん:2010/02/11(木) 22:39:03
smart_ptrのベンチマーク
代入
boost: 120
framework: 55

速すぎクソワロタww
895デフォルトの名無しさん:2010/02/11(木) 23:34:48
>>890
sscanf()、そして C 言語はそういうもの。文字列のサイズをきっちり管理したいのであれば別の方法をとるべき。
896デフォルトの名無しさん:2010/02/12(金) 00:17:34
>>895
そういうことを聞いてるんじゃないから
897デフォルトの名無しさん:2010/02/12(金) 00:35:54
継承の話なんだが、
struct parent{
int x;int y;int z;
};
struct child :public parent{
int a;int b;int c;
};

int main(){
child Child
parent Parent;
child.x=1;child.y=2;child.z=3;
ofstream ofs("test.txt");
ofs.write(&Child,sizeof(Child));
ofs.close();
ifstream ifs("test.txt");
ifs.read(&Parent,sizeof(Parent));
}

こんな感じで、子の型でファイルに書き込んで、親の型で読み込んでも、ちゃんとx、y、zには1,2,3が入っている?
それともコンパイラ依存になってしまうからやるべきでない?
898デフォルトの名無しさん:2010/02/12(金) 00:42:59
>>883
sscanf() で日本語つーか2バイト文字入るのか。
wchar_t じゃなくて char で。 %s で。


swscanf() とか使わなくていいの?
899デフォルトの名無しさん:2010/02/12(金) 00:52:41
ひとつ聞いていい?

>>883だと、終端文字が入るから実質11バイト必要でバッファオーバーフローしてるよな?
900デフォルトの名無しさん:2010/02/12(金) 01:02:07
>>896
いやいや、sscanf() の引数に sizeof( ) をわたしているから、>>883 はなにか勘違いしているような気が。
901デフォルトの名無しさん:2010/02/12(金) 02:38:45
sscanf_sは文字列を読み取るときにサイズの引数が必要だった気がする
902デフォルトの名無しさん:2010/02/12(金) 07:35:24
バッファオーバーフローはしないし、sizeofを渡すのも勘違いじゃない。
そういうVC独自の関数なんだよ。
903デフォルトの名無しさん:2010/02/12(金) 07:40:54
処理系依存の話はこのスレでするなよ

こっち行け

【初心者歓迎】C/C++室 Ver.71【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1264774545/
904デフォルトの名無しさん:2010/02/12(金) 09:04:50
もう解決済み
905デフォルトの名無しさん:2010/02/12(金) 12:18:55
面白そうなので自分も自作のスマポを計測してみた。
VisualC++2008EE
boost 1.34
使える機能は動的削除子くらい。
でも、削除子やカウンターのメモリ確保に自前のメモリプール使ってるからこのベンチは
実質ほとんどメモリ確保をしないで済んでいる。うちの子が得意なベンチでした。

boost::shared_ptrのベンチマーク
単純な生成ループ: 318
代入ループ: 226
オブジェクトのリセット: 424
オブジェクトの解放: 225

Voiful::obj_ptrのベンチマーク
単純な生成ループ: 70
代入ループ: 69
オブジェクトのリセット: 179
オブジェクトの解放: 73
906デフォルトの名無しさん:2010/02/12(金) 12:29:12
僕の作ったスマポはそもそも使わないのでコストが全て0です!
907デフォルトの名無しさん:2010/02/12(金) 12:52:08
作るのに払ったコストの価値も0だなw
908デフォルトの名無しさん:2010/02/12(金) 13:06:46
メモリプールって早いんだな
リセット機能すらない20行スマポでもその倍ぐらい遅いわ
909デフォルトの名無しさん:2010/02/12(金) 13:09:13
メタプログラミングしかしなければ実行コストなんてないよ
910デフォルトの名無しさん:2010/02/12(金) 13:26:37
メモリ生成・削除だけ比較すると10倍-100倍になったところでたいした意味がない。
Googleのメモリ管理使うと標準と大差付くのだが、
メモリがボトルネックになることが少ない。
メモリを頻繁に生成する実用アプリに組み込んで比較しないと性能でない。
911デフォルトの名無しさん:2010/02/12(金) 13:38:34
俺Lispに初めてメモリプール導入した時は、確か2割くらい速くなった。
こーゆーモノ作る時には有難い方法だね。
912デフォルトの名無しさん:2010/02/12(金) 14:11:07
ヘビーなループの中でメモリアロケーションが発生するような
実装は基本避けるからなー。
913デフォルトの名無しさん:2010/02/12(金) 14:25:05
メモリ生成がボトルネックになる部分は自前で管理したら
いいし速度より安全で確実で使いやすいことが大事だろう。
全てGCで管理するなら速度も大事だけど。
914デフォルトの名無しさん:2010/02/12(金) 16:33:22
シューティングで弾の生成削除とかしまくるときにプール使う
915 ◆GWRSHcLrd6 :2010/02/12(金) 16:52:14
>>905
メモリプールでそんなに速くなるんですね・・・
勉強になります。
916デフォルトの名無しさん:2010/02/12(金) 17:35:47
メモリ確保以外の仕事をしてないから差が大きく見えるけど、たいがいのアプリでは
一縷の望みをかけて試してみるものの、残念な結果に終わるんだぜ。
917デフォルトの名無しさん:2010/02/12(金) 17:47:35
大量のリスト処理とかしないといけないアプリとかだいぶ変わりそうな気もするが
918デフォルトの名無しさん:2010/02/12(金) 18:23:08
シーケンシャルリードを先読みして高速化するライブラリありますか。
919デフォルトの名無しさん:2010/02/12(金) 18:26:30
たとえば、4M * 8個のリングバッファ作って
ファイルからロードする部分と、メモリブロックにアクセスする部分が
並列に動作すればいいと思うんですが。
前方にロックかかっていたら待って終わったら作業。
920デフォルトの名無しさん:2010/02/12(金) 18:35:46
メモリマッピングは巨大ファイル読み込むとメモリ食いまくりで
並列化無しの単純なシーケンシャルリードに速度に劣るんです。
winAPIのcreateファイルでバッファ有りにすると、でかいファイルほど
バッファリングにバグらしくって速度が落ちるんです。
そこでwinapiのバッファ無しで自前で管理したいんです。
処理速度とロード速度が一致していれば、ファイル読み込みがメモリアクセスと同時間で出来ると思うのですが。
921デフォルトの名無しさん:2010/02/12(金) 18:38:03
fopen とかは?
922デフォルトの名無しさん:2010/02/12(金) 18:44:37
fopen = バッファ付きCreateFileAでしょ。
バッファは付いてても先読みはほとんど無いと思うんですが。
多めに読んどくのはあるだろうけど
923デフォルトの名無しさん:2010/02/12(金) 18:52:58
HDDの動作はCPUから見たら糞遅い、ってのはソフトじゃどうしようもないよ。
924デフォルトの名無しさん:2010/02/12(金) 18:57:19
ファイルロード中に、CPUで作業したいって言う話なんです。
20Mのブロックの処理時間が500ms、ロード時間が500msなら
200Mのファイルの処理時間は、10秒になります。
処理とロードが並列動作すれば5秒で出来ます。
925デフォルトの名無しさん:2010/02/12(金) 18:59:59
いまいちよくわかんないけど
普通に非同期で読むのじゃだめなの?
926デフォルトの名無しさん:2010/02/12(金) 19:07:06
メモリマップドファイルをシーケンシャルリードに特化させて
自前でキャッシュ管理したいっていうようなものです。
バッファの空きがあれば読めるだけ読んどく部分と
順アクセスする部分がいるんです。
非同期、マルチスレッドで読み込むんですが、そのキャッシュろロック管理が手間なので
先読みライブラリはない物かと聞きに来ました。
927デフォルトの名無しさん:2010/02/12(金) 19:22:05
ここでする話じゃないよね
928デフォルトの名無しさん:2010/02/12(金) 19:23:27
>>926
最近のパソコンはメモリ多いのでメモリに上げてしまってメモリーストリームのような
仕組みでも考えればいいんだけどそういうのじゃあないんでしょ?
929デフォルトの名無しさん:2010/02/12(金) 19:39:04
ファイルサイズが2G以上でピークメモリは50M以下にしたいです。
順アクセスのみで高速化したいです。
930デフォルトの名無しさん:2010/02/12(金) 23:26:45
非同期でバッファを更新するとか
931デフォルトの名無しさん:2010/02/12(金) 23:34:05
ポーリングよりも割り込み使ってバッファを埋めるようにした方がいいな
しかしそんなAPIあったっけ?
932デフォルトの名無しさん:2010/02/13(土) 00:12:11
madvise とか posix_fadvise みたいなものが欲しいのか?
933デフォルトの名無しさん:2010/02/13(土) 00:12:36
>>931
うん
934デフォルトの名無しさん:2010/02/13(土) 00:19:16
自分でデバイスドライバ書かないと無理っぽくね?
935デフォルトの名無しさん:2010/02/13(土) 00:25:58
>>926
>winAPIのcreateファイルでバッファ有りにすると、でかいファイルほど
>バッファリングにバグらしくって速度が落ちるんです。

それはFILE_FLAG_SEQUENTIAL_SCANフラグを付けないのが悪いような。

>>922
>バッファは付いてても先読みはほとんど無いと思うんですが。

CreateFile以下のOS側に先読み機構があるよ。
ttp://blogs.technet.com/photos/markrussinovich/images/2815675/original.aspx
上の画像の、"System"って書いてあるのがバックグラウンドで動いている先読みプロセス。
もちろんキャッシュにコピーするぶんロスはあるけど。

この手の話ならこれでもどうぞ。
ttp://blogs.technet.com/markrussinovich/archive/2008/02/04/2826167.aspx
936デフォルトの名無しさん:2010/02/13(土) 00:52:57
いまシーケンシャルリード付けたデータ無いけど、以前に付けても付けなくても大差なかったよ。

あとこれほんと。


大容量ファイルI/Oの効率について
FILE_FLAG_NO_BUFFERING 指定のない ReadFile() -赤線-
リニアにアクセス速度が低下していく。
FILE_FLAG_NO_BUFFERING の指定がある場合にはリニアな速度低下の傾向は見られないことから、
大容量ファイルの I/O というかリードを行うことに対して Windows の I/O バッファリングアルゴリズムにパフォーマンスバグがあると思われる。


FILE_FLAG_NO_BUFFERING 指定のある ReadFile() -緑線-
2GiB の読み込みに概ね12-13秒台の高速でコンスタントなアクセス速度を誇る。(・∀・)イイ!! 



FILE_FLAG_NO_BUFFERING 指定のある ファイルマッピング -青線-
2GiB の読み込みに概ね14秒台の区間と概ね20秒台の区間が存在しそのアクセス速度は時系列に矩形波を描く。


http://f.hatena.ne.jp/images/fotolife/w/wraith13/20080430/20080430231453.png
http://d.hatena.ne.jp/wraith13/20080430/1209565632
937デフォルトの名無しさん:2010/02/13(土) 00:55:47
オプション無し=通常通り=fopenで
巨大ファル読み込むと、異常にロードが低下するよ。
3ギガのファイルの先頭100M読み込むだけで大分かかる。2度目はキャッシュ効くけど。
938デフォルトの名無しさん:2010/02/13(土) 00:56:40
つーかよく考えるとシーケンシャル読みなんってHDDのもっとも得意とするところなんで
バッファリングとか考える必要はないんだよな
むしろHDD上でヘッドの移動がほとんど起きないように配置しとけってレベルで

バッファリングが効くのはバッファ内に収まる小さい物とかそんなんだろうな
939デフォルトの名無しさん:2010/02/13(土) 00:59:14
メモリ操作よりかは時間かかりますよ。
先読みしてあれば、読み込みの待ち時間が減らせるんです。
940デフォルトの名無しさん:2010/02/13(土) 01:03:46
>>939
わかってるよ
でもそのバッファの分だけでしょ

ダブルバッファとか仕組みいれてもどうやってもプログラムが処理するデータ量が多ければ
いずれバッファの中は空っぽになってHDDの読み出し速度になってしまう
むしろバッファ制御の無駄な仕組みが速度低下の原因になる可能性だってある
941デフォルトの名無しさん:2010/02/13(土) 01:05:40
いいかげんにスレ違いじゃないか?
該当 OS のスレでやってほしい。
942デフォルトの名無しさん:2010/02/13(土) 01:05:54
素直にストライピングRAID組めば済む話じゃん
943デフォルトの名無しさん:2010/02/13(土) 01:07:55
ロード -> 処理 -> ロード -> とやるより、
並列読みなら、処理時間は無くせて
ロード時間だけに出来るんです。
944デフォルトの名無しさん:2010/02/13(土) 01:08:01
>>942
うむ
小さいファイルならメモリに載せて・・とかだけど
大きなファイルならハードでどうにかしろって話だよな
945デフォルトの名無しさん:2010/02/13(土) 01:08:42
言語のレベルじゃないよ
アルゴリズム?とかそんなんだよ
946デフォルトの名無しさん:2010/02/13(土) 01:09:17
>>936
以前オーディオ再生アプリ書いた時ハマった。
結局FILE_FLAG_NO_BUFFERINGして自前でバッファリングしないと使い物にならなかった。
947デフォルトの名無しさん:2010/02/13(土) 01:37:21
大半のコンパイラで現時点でexportがサポートされていない以上、
テンプレート関数やクラステンプレートのメンバ関数などは
ヘッダファイルに実装を書くことになりますよね?
どうせヘッダファイルに書くなら(そのヘッダの依存性が上がり
再コンパイルのリスクが増えるのは変わらないため)
inline宣言をするかどうかを考える価値が出て来ると思うのですが、
果たしてどんな基準でテンプレート関数をinline宣言すればいいのか分かりません。

短い関数とか言われても今ひとつピンと来ません。
とりあえずEffective C++の指南に基づき
コンストラクタとデストラクタはinlineにはしていませんが。。。
948デフォルトの名無しさん:2010/02/13(土) 01:39:33
>>947
依存性切るための変な仕組みなかったっけ?
949デフォルトの名無しさん:2010/02/13(土) 01:41:31
>>948
いえ、なかったと思います。。。
950デフォルトの名無しさん:2010/02/13(土) 01:43:39
C++はあるよ
http://www.02.246.ne.jp/~torutk/cxx/file/insulation.html

依存性を切る仕組みは重要視されててc#なんかでもそういうコンテナフォーマットあるし
951947:2010/02/13(土) 01:47:14
事前にどんなテンプレート引数が渡されるか分かっていれば
pimplや明示的インスタンス生成explicit instantiationで回避はできます。
ですが、現状>>950のような方法を用いても
完全にテンプレート化された関数はやはりヘッダに書かなければ
ならないと思います。

いずれにせよ
みなさんはどんな基準でヘッダに書いた関数をinline宣言していますか?
952デフォルトの名無しさん:2010/02/13(土) 01:47:18
Pimplイディオムはよく使うな
953デフォルトの名無しさん:2010/02/13(土) 01:52:53
使うな
954947:2010/02/13(土) 02:00:06
私もなんだかんだでpimplは愛用します。
955デフォルトの名無しさん:2010/02/13(土) 02:08:52
俺は inline にしたいような短い奴はクラス宣言の中に入れてしまって明示的に inline 宣言しないことが多い。
956デフォルトの名無しさん:2010/02/13(土) 02:10:38
やばい
.netになれてど忘れしてもた

ライブラリを作ってるんだがその内部でネットワーク経由でデータを受信して
呼び出し元に返す場合は内部で使ってるstd::string(もしくはCString)を
返しちゃだめなんだっけ?・・・
957デフォルトの名無しさん:2010/02/13(土) 02:20:25
先読みライブラリはないの? あと開発できるひと。
958デフォルトの名無しさん:2010/02/13(土) 02:24:04
>>956
いや読み込みはできてるし動いてるんだけど
それをライブラリとして切り離す場合にどうしてたっけかな・・・と思って

Cのころはファイルの読み込みなんかだとサイズを調べて
mallocとかで領域確保してそこへ入れてそれを呼び出し元に渡して・・・
だったけどさ

C++の場合クラスとかになってきてるし、std::stringってクラスぽい動きしてるしで・・・
959デフォルトの名無しさん:2010/02/13(土) 02:33:27
>>951
基本的に inline は使わない。
性能に有意な差が出ると確認できたときに付ける。
template だろうとなかろうと判断基準は変わらないし、変えなくていい。
960デフォルトの名無しさん:2010/02/13(土) 02:50:31
templateはinlineにしない意味はほとんどないじゃない
exportを実装してようがリンク時コード生成を考えたらビルド時間は変わらないし
961デフォルトの名無しさん:2010/02/13(土) 02:50:34
c_str()じゃだめなん?
962デフォルトの名無しさん:2010/02/13(土) 03:12:56
inlineなんてどうせシカトされるというか
書かなくてもインライン化したりするので書かない
963デフォルトの名無しさん:2010/02/13(土) 03:29:30
開発環境:vc++ 2008 expless edition, boost
経験言語:java
vc++を使ってc++の勉強をしているのですが、クラスのポインタにnewとdeleteをすると管理が怖いのでboostのshared_ptrを使いjavaライクにしようかと考えています。
この解決方法は一般的なのでしょうか。それとも一般的にスマートポインタなど使うのは邪道なのでしょうか。
また、スマートポインタに隠蔽することにより隠蔽されたオブジェクトのpublic変数や関数をコード保管機能により呼び出せなくなりました、これの解決方法はあるのでしょうか。
964デフォルトの名無しさん:2010/02/13(土) 03:41:19
>>960
逆だろ。わざわざ付ける意味が無いんだよ。
965デフォルトの名無しさん:2010/02/13(土) 03:44:25
>>963
スマートポインタを使うことが邪道だということは無いが、 Java ライクにしようという目的は邪道だ。
「管理が怖い」とか、非科学的な判断基準を持ち出すべきではない。

スマートポインタに入れることは隠蔽じゃない。補完の件は知らないが、たいした問題じゃないだろう。
966デフォルトの名無しさん:2010/02/13(土) 03:46:31
>>964
オレに逆らうとはいい度胸だな
わざわざ付ける意味が無い証拠は?
967デフォルトの名無しさん:2010/02/13(土) 03:47:13
コンパイラは無視してもいい事になってるから
968デフォルトの名無しさん:2010/02/13(土) 03:50:52
デフォルトが非inlineなのに「inlineにしない意味」とか言い出すのが意味不明。
969デフォルトの名無しさん:2010/02/13(土) 03:55:51
>>965
やはりjavaライクにすべきではないのですか。
僕はjavaに慣れ親しんでいるのでコードのすみずみまで頭に叩き込まずともjavaライクであればささいなきっかけでコードの多くの部分を思い出せると考えました。
しかし、他の人にソースを共有する場合は他の人が僕のルールを理解していることはないのは確実なのでそれは良くないことかもしれないと思います。

コード保管は頭の文字をいれるとそれから予測できる変数や関数を列挙してくれる機能なのですが、ポインタがスマートポインタの中にいるので->で参照したときにコード保管できないという意味で隠蔽という言葉を選択しました。
誤解を招くような言葉で申し訳ございませんでした。
970デフォルトの名無しさん:2010/02/13(土) 03:57:32
>>960はプログラムやる資格ないな。
971デフォルトの名無しさん:2010/02/13(土) 03:59:40
いいんじゃねぇの
Javaライクというのがメモリの管理を自動化したいという意味なら
循環参照に気をつければ

スマポ経由だってインテリセンスは効いてた様な
972デフォルトの名無しさん:2010/02/13(土) 04:18:56
>>971
ありがとうございます。自己的な理由ではありますがスマートポインタを採用しようかと思います。

僕の環境ではboostをインストールし、
インストールされたディレクトリを参照してインクルードしているだけなのですが

たとえば
class Test {
public: int a;
Test() {
a = 100;
}
~Test() {
}
};
というクラスがあり。
コードの一部に以下のようなコードを仕込み試したところ。


shared_ptr<Test> p(new Test());
printf("%d\n", p->a);//インテリセンス無効
Test *p2 = new Test();
printf("%d\n", p2->a);//インテリセンス有効

スマートポインタを介したpはインテリセンスできず、直接のポインタであるp2はインテリセンスでaを参照できました。
なんらかの設定、もしくはアドインのようなものを入れればスマートポインタはインテリセンスできるのでしょうか。
973デフォルトの名無しさん:2010/02/13(土) 04:28:22
>>972 Visual Studio スレ逝け。
974デフォルトの名無しさん:2010/02/13(土) 10:30:36
>>972
インテリセンスに過度な期待は持たないで。
975デフォルトの名無しさん:2010/02/13(土) 10:46:46
Boostスレにも似たようなのが
976デフォルトの名無しさん:2010/02/13(土) 10:50:21
VSスレに行けと言われたのにBoostスレいったのか
まぁ解決?してるようだしいいんじゃね
977デフォルトの名無しさん:2010/02/13(土) 10:52:15
ああ同一人物か
流行ってるのかとおもた
寝ぼけてるな俺
978デフォルトの名無しさん:2010/02/13(土) 11:22:09
1時間放置してみろ
979デフォルトの名無しさん:2010/02/13(土) 12:01:34
>>977
じっくり反省しろ
980デフォルトの名無しさん:2010/02/13(土) 13:24:32
このスレにおいては
インテリセンスって言葉がでたらあぼんする位の勢いで
いいんじゃね?
981デフォルトの名無しさん:2010/02/13(土) 13:47:24
>>977
相変わらずだなあ。まったく・・・
982デフォルトの名無しさん:2010/02/13(土) 18:12:53
ftp://ftp.kde.org/pub/kde/stable/4.3.3/src/kdebase-4.3.3.tar.bz2
このtarボールド(kdeプロジェクト)を展開すると、いくつかのソフトが入っているます
その中で、dolphinというソフトをideで見たいのですが、make fileの作り方がわかりません
お力をお貸しください
983デフォルトの名無しさん:2010/02/13(土) 18:26:33
984デフォルトの名無しさん:2010/02/13(土) 18:46:33
>>983
スレ違いじゃないな
985デフォルトの名無しさん:2010/02/13(土) 19:43:22
make makes manyなんちゃらつースレ落ちたのか
986デフォルトの名無しさん:2010/02/13(土) 21:59:42
>>964
>>968
意味不明だ
要説明
987デフォルトの名無しさん:2010/02/13(土) 23:18:57
988デフォルトの名無しさん:2010/02/13(土) 23:43:24
>>986
逆だろ。まずはお前から、 template に限って inline を使う基準を分けるメリットを挙げてくれ。
そうじゃないとさっぱりわからん。
989デフォルトの名無しさん:2010/02/13(土) 23:50:14
>>988
> 逆だろ。まずはお前から、 template に限って inline を使う基準を分けるメリットを挙げてくれ。
メリットが増えるんじゃなくてinlineにするデメリットが減るって言いたいんじゃないの?
> そうじゃないとさっぱりわからん。
そんなに分からないのか。
merit - demeritの値を考えるとき、
meritが不変でdemeritが小さくなったら
merit - demeritの値は大きくなる
ってことがまさか分からない?
990デフォルトの名無しさん:2010/02/13(土) 23:53:56
最近のコンパイラだと
inlineしてもinlineしなかったり
inlineしなくてもinlineされたりするから
ぶっちゃけ意味ないだろ
コンパイラによっては強制inline用の予約語とかあるけど
そんな一般性を失ってまで指定してもしょうがないし
991デフォルトの名無しさん:2010/02/13(土) 23:56:15
>>989
template に限れば inline にするデメリットが減るのはわかる。最初の >947 から書いてある。

だからと言ってわざわざ template に限って inline を付ける基準を変えることにメリットはないでしょ?
そこがわからない。
992デフォルトの名無しさん:2010/02/14(日) 00:02:55
inlineスレ
993960かつ986:2010/02/14(日) 00:19:11
込み入った議論もしたいが規制中なので困難
クラス定義で手間や重複が最小なのはクラス定義にメンバ関数の定義を含めるやりかた。つまりinline
しかし、依存性を軽減してコンパイルの無駄を抑えるためにメンバ関数の宣言と定義を別にしているわけ
templateでは非inlineにしても依存性を軽減しないので、inlineにしない意味がないといったわけ
994989:2010/02/14(日) 00:31:12
>>991
> だからと言ってわざわざ template に限って inline を付ける基準を変えることにメリットはないでしょ?
template に限って inline を付ける基準を変える
なんて誰も言ってないだろ?
むしろ
     基準は同じ
だから、
merit - demeritの値が大きくなる場合が増える
templateでは自動的にinlineにすべきという
判定が増えるってこと。
995デフォルトの名無しさん:2010/02/14(日) 00:34:20
> inlineにしない意味がない

inline 指定子を書くべきってこと?
996デフォルトの名無しさん:2010/02/14(日) 00:48:08
>>993
クラス定義にメンバ関数の定義を含めるかどうかの話なら同意だ。
クラステンプレートのメンバ関数を分けるための記述はめんどくさいしねぇ。
997デフォルトの名無しさん:2010/02/14(日) 01:03:30
>>994
めんどくさい人だな。
template かどうかで inline を付けるかどうかの「判断」を変える必要が無いって言ってるんだよ。

inline の指定によってが性能に有意な差が出ると確認できたところで、コンパイル時の依存関係を
嫌って効率を落とすような判断はしないでしょ。

inline って付ければ必ずメリットが生まれるとでも思ってるのか?
998デフォルトの名無しさん:2010/02/14(日) 01:29:26
うめ!
999デフォルトの名無しさん:2010/02/14(日) 01:44:15
たけ!
1000デフォルトの名無しさん:2010/02/14(日) 01:44:30
どうも
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。