C++相談室 part77
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/01/15(金) 21:02:12ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part76
http://pc12.2ch.net/test/read.cgi/tech/1260972593/
0002デフォルトの名無しさん
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)に対応。
0003デフォルトの名無しさん
2010/01/15(金) 21:03:06amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0004デフォルトの名無しさん
2010/01/15(金) 21:03:16Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0005デフォルトの名無しさん
2010/01/15(金) 21:03:28Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0006デフォルトの名無しさん
2010/01/15(金) 21:03:38ttp://codepad.org/
長いソースを貼るときはここへ!
0007デフォルトの名無しさん
2010/01/15(金) 21:03:50環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0008デフォルトの名無しさん
2010/01/15(金) 21:04:040009デフォルトの名無しさん
2010/01/16(土) 00:13:02class 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でコンパイルエラーがでる
原因がさっぱりわからない・・・
0010デフォルトの名無しさん
2010/01/16(土) 00:38:12template <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;
}
001110
2010/01/16(土) 00:46:27boost::function(int())でいつも使ってたからint(void)はできないのかも?っと思ってたんだけど、
念のためにboost::functionで試してみたら、boost::function<int(void)>はあっさり通るのね。boost::functionのソース見れば分るかも。
0012デフォルトの名無しさん
2010/01/16(土) 01:12:01> template <class R, class A>
> class widget<R(A)>
これは引数をひとつ取る関数に対する特殊化。
引数を取らない関数について適用されないのは当然と言えば当然。
引数を取らないことを表す引数リスト (void) は括弧も含めた特殊な
構文であって、型が void の引数をひとつ指定すれば有効というわけじゃない。
つまりこんなの↓も実は不正。
typedef void A;
int f(A);
0013デフォルトの名無しさん
2010/01/16(土) 13:23:16超分かりやすい
0014デフォルトの名無しさん
2010/01/16(土) 15:37:26ありがとう
0015デフォルトの名無しさん
2010/01/16(土) 17:38:28示されていますか?
Boostよりはやっぱ動きにくいんですか?
0016デフォルトの名無しさん
2010/01/16(土) 19:52:38template < class Type >
class BaseVec2
{
public:
Type x;
Type y;
//メソッドは省略
}
typedef BaseVec2<double> Vec2f;
typedef BaseVec2<int> Vec2i;
int main()
0017デフォルトの名無しさん
2010/01/16(土) 20:00:33template < 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が勝手に代入される )やり方ってありませんか?
0018デフォルトの名無しさん
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; }
0019デフォルトの名無しさん
2010/01/16(土) 20:43:49解決しました
ありがとうございます
0020デフォルトの名無しさん
2010/01/16(土) 22:43:24一応注意しておくが、テンプレートコンストラクタやテンプレート代入演算子は
(最終的なシグネチャが同一でも)コピーコンストラクタやコピー代入演算子ではないので、
それらを定義しないと依然としてコンパイラが自動生成する。
単にメンバ全部コピー以外の処理を行いたい場合は気をつける必要がある。
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; }
};
0021デフォルトの名無しさん
2010/01/16(土) 23:13:350022デフォルトの名無しさん
2010/01/16(土) 23:17:52これはEffective C++にも書いてあったと思うが。
0023デフォルトの名無しさん
2010/01/17(日) 00:58:48読んで無い奴もいるだろうよ
0024デフォルトの名無しさん
2010/01/17(日) 12:47:500025デフォルトの名無しさん
2010/01/17(日) 13:28:35これ読むくらいならExceptional C++でも読むほうがましかなー
0026デフォルトの名無しさん
2010/01/17(日) 14:58:31そんな実力上がってから『Effective C++』を批判するのは卑怯では?
その理屈だとさらに実力を上げてから『Exceptional C++』を読んでも
そんなん知ってるよって言うことになるのでは?
0027デフォルトの名無しさん
2010/01/17(日) 15:43:08自動的に定義してくれるテンプレートみたいのなかったっけ
思い出せなくて、ぐぐってもうまくぐぐれなくて見つからない
0028デフォルトの名無しさん
2010/01/17(日) 15:45:07そんなウンコな機能要らない。
貴様はクラスの実装からインターフェースを書き起こすのか?逆だろ?
0029デフォルトの名無しさん
2010/01/17(日) 15:45:320030デフォルトの名無しさん
2010/01/17(日) 15:46:390031デフォルトの名無しさん
2010/01/17(日) 15:47:340032デフォルトの名無しさん
2010/01/17(日) 15:48:24じゃあ答えは見ずに、聞けば(>>29)いいのか?w
0033デフォルトの名無しさん
2010/01/17(日) 15:48:40デザパタってのがあるだろ。
それと同じで、良い実装を読むことは負けじゃない。
0034デフォルトの名無しさん
2010/01/17(日) 16:07:52ぶっちゃけるとweak_ptr用とshared_ptr用に二つ参照カウンタ持ってるだけ。
0035デフォルトの名無しさん
2010/01/17(日) 16:11:18ぶっちゃけたwww
0036デフォルトの名無しさん
2010/01/17(日) 16:49:57void func(X &x) { 〜 };
X x;
Y y;
X &r = x;
func(r);
X &s = y;
func(s);
↑のfunc(s)をエラーにしたい(派生クラスを受け付けたくない)んですけどそういうことは可能でしょうか?
0037デフォルトの名無しさん
2010/01/17(日) 16:59:38Y を直接渡したときならまだしも、 X に変換した後ではコンパイラには区別が付かない。
仮想関数がついてれば typeid で調べることはできる。
そもそもそんなことがしたくなること自体、何か継承というものについて誤解があるんじゃ
ないかと思う。
0038デフォルトの名無しさん
2010/01/17(日) 17:11:03template <class T> class obj_pool
{
public:
T *Alloc();
void Dealloc(T *p);
private:
list<T *> objs;
};
こんな感じでオブジェクトを使いまわそうかと思ったんですが
どの派生型でもDeallocで格納できてしまうので
取り出すときに区別がつかなくなってしまいます
0039デフォルトの名無しさん
2010/01/17(日) 17:12:11「基底クラスに対してできる操作は全て派生クラスに対してもできなければならない」
これが public継承の基本 です。
あなたのケースで言えば
「Xに対して適用できる関数func()はYに対してもできなければならない」
ということになります。
逆にこの public継承の基本 が満たされない場合、それは
YはXの特別な場合ではないということになり、
public継承が不適切な場合ということになります。
0040デフォルトの名無しさん
2010/01/17(日) 17:14:45最初に Alloc() で作った奴しか Dealloc() できない、とかそういうルールで使えば
いいんじゃないの?
RAII スタイルのラッパーを用意するとか。
0041デフォルトの名無しさん
2010/01/17(日) 18:45:45template<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);
では何がちがうんですか??
0042デフォルトの名無しさん
2010/01/17(日) 18:53:06それユーザー側が obj_pool を明示的に使うの?
Factory 関数作って deleter を適正に設定した shared_ptr を返すとか。
0043デフォルトの名無しさん
2010/01/17(日) 18:53:35それ、クラステンプレートじゃなくて関数テンプレート。
下の二つは、テンプレート引数が違う。
004441
2010/01/17(日) 19:19:21すいません。例を挙げるために書いたもので。
>下の二つは、テンプレート引数が違う。
ということは・・・?
0045デフォルトの名無しさん
2010/01/17(日) 19:20:48同じだったと思う。
型名の(*)は*を省略可能だから()にできて、
さらに()も省略可能なので。
004641
2010/01/17(日) 19:24:39ありがとうございます。
0047デフォルトの名無しさん
2010/01/17(日) 19:25:45public:
Foo();
~Foo();
private:
static std::vector<int> m_vec;
};
static std::vector<int> m_vec;
この正しい初期化の仕方を教えてください。
0048デフォルトの名無しさん
2010/01/17(日) 19:29:02http://codepad.org/C77yrjrC
これの結果を見る感じ省略ではないと思うけど・・・
0049デフォルトの名無しさん
2010/01/17(日) 19:37:46上は関数型で下は関数へのポインタ型。
至る所で関数型は関数へのポインタ型に調整されてしまうので
func<void(int, int)> も引数の型は関数へのポインタ型になっている。
でも T 自体は関数型のままでオブジェクト型ではないから例えば
T obj2 = obj; みたいなことはできない。
関数へのポインタ型の場合は可能。
http://codepad.org/RIyF5kFS
0050デフォルトの名無しさん
2010/01/17(日) 19:55:040051デフォルトの名無しさん
2010/01/17(日) 20:35:24お願いします。
0052デフォルトの名無しさん
2010/01/17(日) 20:37:540053デフォルトの名無しさん
2010/01/17(日) 20:54:37memset(&m_vec, 0, sizeof(m_vec));
0054デフォルトの名無しさん
2010/01/17(日) 20:55:420055デフォルトの名無しさん
2010/01/17(日) 20:58:00std::vector<int> Foo::m_vec;
これでデフォルトの初期化を行う定義ができる。
初期化引数が指定したかったら
std::vector<int> Foo::m_vec(...);
0056デフォルトの名無しさん
2010/01/17(日) 21:27:18>>55
static なvectorコンテナなのですが・・・・?
0057デフォルトの名無しさん
2010/01/17(日) 21:38:05をヘッダに書いてるってオチだな
0058デフォルトの名無しさん
2010/01/17(日) 21:52:01const hoge& func(const hoge& a)
{
return a;
}
void func2()
{
const hoge& a=func(hoge());
a.func3(); ///ここで、上の行のhoge()一時オブジェクトの参照はセーフ?
}
0059デフォルトの名無しさん
2010/01/17(日) 21:58:010060デフォルトの名無しさん
2010/01/17(日) 22:16:30「上手くいきません」じゃわからん。
期待する結果と、そのために何をしたのかと、実際の結果を出せ。
0061デフォルトの名無しさん
2010/01/17(日) 22:17:18アウト。
最初の文の終わりで一時オブジェクトは死ぬ。
0062デフォルトの名無しさん
2010/01/17(日) 22:39:22むむむ、やっぱりそうですか。ありがとうです
006341
2010/01/17(日) 23:18:49いいサイトってありませんかね?
0064デフォルトの名無しさん
2010/01/17(日) 23:26:340065デフォルトの名無しさん
2010/01/17(日) 23:34:310066デフォルトの名無しさん
2010/01/17(日) 23:36:55死んでしまえばいいのに
0067デフォルトの名無しさん
2010/01/17(日) 23:43:07ワロスw
0068デフォルトの名無しさん
2010/01/18(月) 00:16:24なんでそんなことも出来ないの?
0069デフォルトの名無しさん
2010/01/18(月) 06:38:440070デフォルトの名無しさん
2010/01/18(月) 13:00:32仮に誰かが回答したとしても当てずっぽう以外にはあり得ないということ。
0071デフォルトの名無しさん
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)
0072デフォルトの名無しさん
2010/01/18(月) 19:02:44"Hello, World!" は char 型の配列だぜ
signed でも unsigned でもなく
0073デフォルトの名無しさん
2010/01/18(月) 19:16:01たとえばcharに対する右シフトのコードはバグの元になるから
意識してsigned/unsignedを付けるべきかなって思ったわけです
でも、リテラルがchar型だと使わざるを得ないですね
intとshortは省略するとsignedなのになんでcharだけ特殊なんでしょう
やっぱ過去の遺産?
0074デフォルトの名無しさん
2010/01/18(月) 21:33:54規格をあたるのが一番だと思う。初見だと厳しいとは思うけど。
使用例なら 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)
って書いてある。
0075デフォルトの名無しさん
2010/01/18(月) 21:38:590076デフォルトの名無しさん
2010/01/18(月) 21:54:13charを純粋に文字型として使えば問題nothing
1バイト整数として使いたいなら
typedef signed char sbyte;
typedef unsigned char byte;
とか?
0077デフォルトの名無しさん
2010/01/18(月) 22:18:35struct TEST stTest = { 0, 1, 2 };
クラスのメンバ構造体をこのような = { ・・・ }のカタチで初期化することはできないのでしょうか?
0078デフォルトの名無しさん
2010/01/18(月) 22:20:12それかC++0xを待つか
0079デフォルトの名無しさん
2010/01/18(月) 22:56:11もう泣けてくる程使いにくいよね
0080デフォルトの名無しさん
2010/01/18(月) 23:14:58ありがとうございます。
少し違った質問で、
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 }; // これはエラーになってしまいますが
こんな感じです。
0081デフォルトの名無しさん
2010/01/18(月) 23:31:31stTEST にコンストラクタを作れば
m_mapTest["てすと"]=stTEST(1,2);
とはできる。
これも C++0x で stTEST{1,2} みたいにできるようになるんだっけ?
008280
2010/01/18(月) 23:44:12おー、まさにやりたいのがそれです。
それをそのままmapに放り込んでやりたいのですよ。
新C言語は他にもスマートポインタが標準化されたりとうれしいことが多いですね。
構造体にコンストラクタを設けるのは個人的な信条から抵抗があるのですが、
有効とあらば考え方を改めたいですし、検討します。
教えてくださって、ありがとうございました!
0083デフォルトの名無しさん
2010/01/18(月) 23:59:56template <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行になるよ
0084デフォルトの名無しさん
2010/01/19(火) 00:39:34class 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 *&' に変換できません。 」
とエラーが出ます……ポインタでのソートすることはやはりできないのでしょうか?
008684
2010/01/19(火) 00:52:320087デフォルトの名無しさん
2010/01/19(火) 15:57:06既存の文字列ポインタを返しているんですか?
0088デフォルトの名無しさん
2010/01/19(火) 16:47:150089デフォルトの名無しさん
2010/01/19(火) 17:31:27知りたいのはスコープじゃなくて、いつまで有効かでしょ?
元のstd:stringの非constなメンバ関数を呼び出すか、std::stringが破壊されるまで有効です。
0090デフォルトの名無しさん
2010/01/19(火) 20:56:05あれ? いつ変動するかがstringの気分だから、その場その場以外では使わないでね的な事が本に書いてあったけど、非constなメンバ関数を呼び出すってのがそれに当たるのか・・?
std::string a = "hogehoge";
char *c = a.c_str();
って感じでそのポインタ後で使おうとしちゃダメ、みたいな。
0091デフォルトの名無しさん
2010/01/19(火) 21:03:16俺も
>元のstd:stringの非constなメンバ関数を呼び出すか、std::stringが破壊されるまで有効です。
って聞いているが。
聞いているじゃなくて誰かが規格を開いてくれることを期待
0092デフォルトの名無しさん
2010/01/19(火) 21:40:430093デフォルトの名無しさん
2010/01/19(火) 22:09:50だったら c_str 自体の存在意義がないわけだが
0094デフォルトの名無しさん
2010/01/19(火) 22:16:46規格にはこう書いてある↓
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.
0095デフォルトの名無しさん
2010/01/19(火) 22:46:14std::string a;
aに対して何かしらの操作が行われなければ内部バッファのメモリ領域も変更されないでしょ。
たとえば非constな操作によって別のメモリ領域に移動する場合はあるけど
constな操作(c_str)のようなものなら別のメモリ空間が再割り当てされる心配もない。
0096デフォルトの名無しさん
2010/01/19(火) 22:56:33> 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
が結論を書いてくれているが。
0097デフォルトの名無しさん
2010/01/19(火) 23:27:37>delete p;
何かしらの操作がされていると思うのだが。
0098デフォルトの名無しさん
2010/01/20(水) 03:02:52009996
2010/01/20(水) 05:34:11うむ。
確かに何かしらの操作だな。
あんま良い例だとは言えなかった。
じゃあstd::stringの内部のバッファが連続しているとは限らないとかがよかったかな?
まあ要するに
> 希望的観測やこんな実装が多いってのではなくその挙動が
> 規格で保証されていれば良いけど。
ってのが言いたいだけだ。
0100デフォルトの名無しさん
2010/01/20(水) 06:16:06c_strの戻り値は非constメンバを呼ぶと無効になる
=非constメンバを呼ぶまでは有効
と書いてるでおk?
0101デフォルトの名無しさん
2010/01/20(水) 10:29:210102デフォルトの名無しさん
2010/01/20(水) 10:55:43string str;
while ( fin.get(str) ) { stringstream line(str); ... }
をstr無しでやる方法はないですか?
ifstream fin;
stringstream line;
while ( fin.get(line) ) { ... }
みたいな感じで
0103102
2010/01/20(水) 10:59:57ifstream fin;
string str;
while ( std::getline(fin, str) ) { stringstream line(str); ... }
0104デフォルトの名無しさん
2010/01/20(水) 12:31:27勉強になったわ。
0105デフォルトの名無しさん
2010/01/20(水) 18:51:27>std::stringの内部のバッファが連続しているとは限らない
えっ?そうなのか?
「内部のバッファが連続しているとは限らない」なら普通にc_str()の呼び出しで一回だけ使うことですら危険じゃないだろうか。
仮にstd::stringのc_str()の実装が((以下、実際の実装がそうなっているという意味ではないぞ))
「内部的に連続していないかもしれない領域を保持しており、c_str()の呼び出しで再度領域の割り当てを行い、連続したバッファを返却する仕様」だとしても、
「返却された値がいつ無効になるのか分からない仕様」だとすると、前述したように「c_str()の呼び出しで戻り値を一回だけ使うことですら危険」だよな。
つまり、何かしらの無効になるタイミングがあるはずでそれが>>89だろ。
>>93でも言われているわけだが。
まぁ>>94が結論を書いてくれているが。
0106デフォルトの名無しさん
2010/01/20(水) 19:47:53c_strはconst引数のレガシーコード直渡し専用だな
0107デフォルトの名無しさん
2010/01/20(水) 19:53:19> えっ?そうなのか?
そうなんだよ。
もし連続していることが保証されていたら、
string::iteratorは仕様でchar*に固定されていただろうし、
c_str()なんてメンバ関数も無かったかもね(begin()で済んでしまう)。
0108デフォルトの名無しさん
2010/01/20(水) 20:02:59規格と現実大分違うから夢から覚めなさいー
010999
2010/01/20(水) 21:08:44> > >std::stringの内部のバッファが連続しているとは限らない
> えっ?そうなのか?
そうなんだよ。
意外に知らない人(というか決めつけている人)が多いんだよね。
>>107氏の解答が分かりやすいよね。ありがとうございます。
あと俺は
C++0xではstd::stringの内部のバッファの連続が保証されるという
夢を見たのだが、今年こそ正夢になるんだっけ?
0110デフォルトの名無しさん
2010/01/20(水) 21:09:52そういえばstd::vectorも以前は連続性の保証はなかったよね。
0111デフォルトの名無しさん
2010/01/20(水) 21:12:07規格制定後Defect Report Listが出るまでの間のことか?
0112デフォルトの名無しさん
2010/01/20(水) 21:16:590113デフォルトの名無しさん
2010/01/20(水) 21:19:4369. 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
0114デフォルトの名無しさん
2010/01/20(水) 21:35:00その後の段落は要するに>>93と>>94の内容だから、>>105宛にレスする所はまったく無くて、
だから>>105特有の箇所にだけレスが付いたんだろう。
0115デフォルトの名無しさん
2010/01/20(水) 21:36:120116デフォルトの名無しさん
2010/01/20(水) 21:48:30char* でも構わないというだけで、char* でなければならない理由にはならない
begin() の他に data() もあるように、string は冗長性が残っているクラスだ
0117デフォルトの名無しさん
2010/01/20(水) 21:57:35だから、皆その話をしてるんでしょ。
0118デフォルトの名無しさん
2010/01/20(水) 22:20:02getline(fin, line) できるローカルな関数でも作れば?
0119デフォルトの名無しさん
2010/01/21(木) 18:19:120120デフォルトの名無しさん
2010/01/22(金) 13:37:080121デフォルトの名無しさん
2010/01/23(土) 14:00:260122デフォルトの名無しさん
2010/01/23(土) 15:01:14ソースがあればWindows用にコンパイルし直せ
なければ諦めろ
あとスレ違い
0123デフォルトの名無しさん
2010/01/23(土) 18:36:47全要素を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
0124デフォルトの名無しさん
2010/01/23(土) 19:25:22そりゃ template<class>
0125デフォルトの名無しさん
2010/01/23(土) 19:26:19そりゃ template<class> 要求されてるところに template<int, class>渡したらエラーにもなるだろ
0126デフォルトの名無しさん
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(); }
0127デフォルトの名無しさん
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(); }
0128これでいいよ
2010/01/23(土) 20:33:27struct 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();
}
0129123
2010/01/23(土) 22:30:51template<class tr> struct IterPrintで宣言したものを,
template<int x, class children> struct IterPrint<Tree<x,children> >で特殊化しているのですが,
特殊化したIterPrint内でIterPrintをIterに渡すところで,特殊化した版のIterPrintが
渡されてしまっているので上手くいってないんではと想像しています.
これを特殊化しない版のIterPrintを渡せないのかなと.
>>128
ありがとうございます.
なるほど二分木だときれいに書けるのかー.
何も考えずに子をリストで持とうとしていました.
0130デフォルトの名無しさん
2010/01/24(日) 15:15:500131デフォルトの名無しさん
2010/01/24(日) 15:29:51boost::shared_ptrを設けているのですが、NULLを引数に渡してその関数をコールすると、
コンパイラに
1 番目の引数を 'int' から 'boost::shared_ptr<T>' に変換できません。
と怒られてしまいます。
親クラスにデフォルトコンストラクタなどを用意しておけば、この引数付きコンストラクタを
呼ばないで済むのですが、
できるだけ統一的に扱いたいのと、その他の場面で同様の問題があるかもしれないことから、
NULLを代入する(無効なポインタにする)方法を知りたいです。
ご助言、よろしくお願いします m(_ _)m
0132デフォルトの名無しさん
2010/01/24(日) 16:16:330133デフォルトの名無しさん
2010/01/24(日) 16:26:530134デフォルトの名無しさん
2010/01/24(日) 16:27:170136デフォルトの名無しさん
2010/01/24(日) 18:50:47>128 じゃないけど。型であることを明示する typename の親戚みたいなもん。
. -> :: の左側が依存型である場合に次に来るのが member template であることを明示する。無いと < が比較演算子として解釈される。
ttp://www.comeaucomputing.com/techtalk/templates/#templateprefix
0137デフォルトの名無しさん
2010/01/24(日) 20:17:38どうも。クラスがテンプレート関数を持つ場合に必要なわけですね
関数テンプレートはあまり使わないから知らなかったっす
>>128
tree_dataを変えないなこんな感じに
codepadって初めてつかた
ttp://codepad.org/D8QumP07
0138デフォルトの名無しさん
2010/01/24(日) 21:03:33C/C++に限らず別の言語もおkだし、
plain textをうpするのにも便利。
0139デフォルトの名無しさん
2010/01/25(月) 10:37:180140デフォルトの名無しさん
2010/01/25(月) 20:25:46g++使えばいいのに。
というかComeau C++使えば
標準準拠度を確かめるには最適。
0141デフォルトの名無しさん
2010/01/26(火) 04:04:24という関数があって、
TがX(int)というメンバ関数を持ってたら、そのXを呼び出し、
持っていなかったら、別の処理をする。ってことをtemplateで出来ませんか?
0142デフォルトの名無しさん
2010/01/26(火) 04:42:24boostのalignment_storageは使わずに適当にchar buffer[sizeof(T[N])];なんてしていいんでしょうか。
不安なのでchar buffer[sizeof(boost::array<T, N>)];ってしてます><
0143デフォルトの名無しさん
2010/01/26(火) 06:41:35boostにそれっぽいのがあった気がする。
「boost has_member」あたりでググってみてくれ。
0144デフォルトの名無しさん
2010/01/26(火) 17:39:51スマートポインタを覚えたので使ってみようかと思ってるんですが
とりあえずPogeみたいにフル?につけたら
変数のアクセスへの構文が大変になってしまいました
typedef list<shared_ptr<wstring> > strlist;
class Poge{
auto_ptr<strlist> m_pslist; //m_pslistは常にPogeが所有
//...
};
class Moge{
strlist m_slist;
//...
};
0145デフォルトの名無しさん
2010/01/26(火) 18:06:45そのリストの所有権がオブジェクトの間を移動しないならMogeで十分だろ
0146デフォルトの名無しさん
2010/01/26(火) 19:01:120147デフォルトの名無しさん
2010/01/27(水) 00:53:28ってやると警告がでるんだけど、古いの?
環境はg++ (Ubuntu 4.3.3-5ubuntu4) 4.3.3
0148デフォルトの名無しさん
2010/01/27(水) 00:59:140149147
2010/01/27(水) 01:14:17warning: #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.
こんなのが出る
0150デフォルトの名無しさん
2010/01/27(水) 01:17:570151デフォルトの名無しさん
2010/01/27(水) 01:25:070152デフォルトの名無しさん
2010/01/27(水) 01:27:320153デフォルトの名無しさん
2010/01/27(水) 01:43:36x86/x86-64で良ければこれとか。
http://labs.cybozu.co.jp/blog/mitsunari/2008/06/fast_strlen_and_memchr_by_sse2_1.html
0154デフォルトの名無しさん
2010/01/27(水) 04:14:46「○○ かつ △△ もしくは □□ かつ ◇◇だったら」なんてのを考えたら
if(○○ && △△ || □□ && ◇◇)
ってなるけどコレってもっとスマートに書けないん?
0155デフォルトの名無しさん
2010/01/27(水) 04:31:13例えばどういう風に書けたらスマートだと思うん?
0156デフォルトの名無しさん
2010/01/27(水) 05:11:120157デフォルトの名無しさん
2010/01/27(水) 05:17:00いや、そうじゃなくて、具体的にどう記述できたらスマートだと思うん?
0158デフォルトの名無しさん
2010/01/27(水) 05:19:08を
if(○○ && △△ || □□ && ◇◇)
以上に「短く・わかりやすく」なんて書けないと思うが。
0159デフォルトの名無しさん
2010/01/27(水) 05:28:230160デフォルトの名無しさん
2010/01/27(水) 09:01:18括弧がないとさっぱりわからん。
0161デフォルトの名無しさん
2010/01/27(水) 15:33:54つーかそんな細かい所の見た目の綺麗さを気にしてたら永遠に先に進めないと思うんだが・・・
0162デフォルトの名無しさん
2010/01/27(水) 16:51:45moge、pogeの由来ってなに?
0163デフォルトの名無しさん
2010/01/27(水) 16:53:15physical
0164ポインタだからPogeとか適当に名前を付けただけの144が通りました
2010/01/27(水) 17:58:160165デフォルトの名無しさん
2010/01/27(水) 22:50:57SFINAE 使えば一応実装はできるだろうけど(規格的にも現実的にも)移植性のある方法ではないはず。
関数の signature が一致したところその挙動まで一致する事が保証されるわけじゃないから、
個人的には traits を使うべきじゃないかと思っている。
>142
単純に同一サイズ確保したいだけなら sizeof(T[N}) でも sizeof(T)*N でもいいだろうけど、
その型としてアクセスするんだったらアラインメント考える必要があるんで、char 型の時点で駄目ぽ。
>147
今なら tr1/unordered_map 使うんじゃないの?
0166デフォルトの名無しさん
2010/01/27(水) 22:59:49テンプレートいじってていつもこれはtraitsと言っていいもののかな?って迷うわ
0167デフォルトの名無しさん
2010/01/28(木) 02:17:210168デフォルトの名無しさん
2010/01/28(木) 13:41:10あるインターフェースを継承したオブジェクトを動的ライブラリ側で生成して主プログラムで扱うばあいに
主プログラムと動的ライブラリをコンパイルしたコンパイラが別物でも安全なんでしょうか?
0169デフォルトの名無しさん
2010/01/28(木) 14:04:39安全ではありません
単純な単一継承のクラスで、メンバ関数を普通に呼ぶだけの場合は、
“たまたま” 互換性のある構造になっていて、問題ないことが多いですが、保証されてはいません
0170デフォルトの名無しさん
2010/01/28(木) 16:48:11packしたPOD構造以上のものは渡さないほうがいいみたいですね
0171デフォルトの名無しさん
2010/01/28(木) 20:03:35こんな関数があったときに、受け取り側でちゃんとメモリ解放するにはどうやればよいのですか?
string &r(ret1());
cout << r << endl;
r.~basic_string();
どうやってもメモリリークしてしまいます
string* p=NULL;
*p=ret1();
delete(p);
0172デフォルトの名無しさん
2010/01/28(木) 20:06:50不可能
0173デフォルトの名無しさん
2010/01/28(木) 20:16:38#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) ポインタを返してコピーコンストラクタへ渡して使う
0174デフォルトの名無しさん
2010/01/28(木) 21:07:05さっきみたいな書き方はしないことにします
ありがとうございました
0175デフォルトの名無しさん
2010/01/29(金) 09:16:00template+functorだと実行時に動的にできない
仮想関数+functorだとnew/deleteのコストがかかるし、参照だと寿命に融通が利かない
クロージャってC++では再現できませんかね?
0176デフォルトの名無しさん
2010/01/29(金) 10:08:100177デフォルトの名無しさん
2010/01/29(金) 10:44:15それだと結局中の人がtemplateもnewも使ってますけど・・・
0178176
2010/01/29(金) 11:30:47確かに 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
0179デフォルトの名無しさん
2010/01/29(金) 12:01:30C++ 以外の言語にあるクロージャは new/delete 相当のコストがかからないのかい?
0180デフォルトの名無しさん
2010/01/29(金) 12:07:22int f(){
struct impl{static int g(){return 10;}};
return impl::g();
}
0181デフォルトの名無しさん
2010/01/29(金) 13:17:19何をどこに囲い込んだんだ?
0182デフォルトの名無しさん
2010/01/29(金) 13:43:20Oh...関数ポインタの場合はnewしないんですね知らなかった
bindってどうやって実装してるのか謎ですわ
0183デフォルトの名無しさん
2010/01/29(金) 13:48:070184デフォルトの名無しさん
2010/01/29(金) 23:54:15C++プログラムのソースコードの文字コードは
結局何にするのがいいんでしょうか?
開発環境にも依るとは思いますが、
一般論でこれがいいとか
これが無難だとかありますでしょうか?
よろしくお願いします。
0185デフォルトの名無しさん
2010/01/30(土) 00:09:40「Unicode不許可」
「トライグラフで万全」
0186デフォルトの名無しさん
2010/01/30(土) 00:13:530187184
2010/01/30(土) 00:27:37どうしてそういう意地悪なことを言うのですか
>>186
やっぱそうなりますか。
コメントの中以外にASCII文字以外が出て来ないなら
文字コードは何でもいい。
・・・なんてことにはなりますか?
0188デフォルトの名無しさん
2010/01/30(土) 01:17:300189デフォルトの名無しさん
2010/01/30(土) 02:07:52boost::function が new を使うかどうかは、関数ポインタの場合じゃなくて、処理と引数を
記憶するために必要な領域の大きさによって決まる。
0190デフォルトの名無しさん
2010/01/30(土) 02:09:54環境に合わせて選べ、っていう一般論。
0191デフォルトの名無しさん
2010/01/30(土) 06:15:03ってのをよく見るな。
マルチバイト版がなんのために必要なのかよく分からない。
速度の問題?
0193デフォルトの名無しさん
2010/01/30(土) 06:46:46ポインタでの操作やキャストが行われない限り仮想関数テーブルを用いたオーバーライドの動的解決はされず
速度には影響しないと考えていいのでしょうか。
0194デフォルトの名無しさん
2010/01/30(土) 08:55:160195デフォルトの名無しさん
2010/01/30(土) 11:11:15きっと他のボトルネックが見つかるはずw
0196デフォルトの名無しさん
2010/01/30(土) 11:27:52Win95/98/Meで動かす場合のため
もはや過去の遺物
0197デフォルトの名無しさん
2010/01/30(土) 12:25:26int my::lstrcmp(const wchar_t *str1, const wchar_t *str2) { return lstrcmpW(str1, str2); }
c++だったら↑のようにラップしたほうが使いやすい
0198デフォルトの名無しさん
2010/01/30(土) 14:59:25?ポインタでアクセスするかどうかなんて、
オーバーライドの動的解決に関係ないだろ。
0199デフォルトの名無しさん
2010/01/30(土) 15:31:55何かいい方法ないですか?
0200デフォルトの名無しさん
2010/01/30(土) 15:54:20携帯電話なんかでもSymbianがフレームワークとして仮想関数使いまくりだし
パレートの法則にあたるようなボトルネックは大抵別にあるだろうし
C++で開発するレベルの機器で気にしてもしょうがないんだろうがなぁ
0201デフォルトの名無しさん
2010/01/30(土) 17:32:43hoge.insert(make_pair("てすと", 10));
map<int, string> hoge;
hoge.insert(make_pair(10, "てすと"));
VS2008で上のがコンパイルできて、下のが出来ない理由って何なんでしょ?
0202デフォルトの名無しさん
2010/01/30(土) 17:43:45どうにもとっかかりが無くて困っています。
おおよその理論は分かっているのですが、形にすることが全くできません。
ググって見たりはしたものの、それらしきプログラムソースもみつけることができませんでした。
助けてください。
因みに、C++で組みます。
0203デフォルトの名無しさん
2010/01/30(土) 17:44:130204デフォルトの名無しさん
2010/01/30(土) 18:06:39なぜ?
baseクラスをdrivedが継承している時、drivedインスタンスのアドレスがbase*に入っていれば
そのポインタからbase内のdrivedでオーバーライドされた仮想関数を解決する時にオーバーヘッドが発生するのでは?
逆にポインタや参照からではなくインスタンスを直接叩けば仮想関数テーブルの解決なんてしなくても
drivedインスタンスはdrivedインスタンスでしかないしdrivedを継承した更に別のクラスのインスタンスである可能性もない。
0205デフォルトの名無しさん
2010/01/30(土) 18:24:23両方を1つずつ試したけど、エラーは起きなかったよ。
エラーになる要因も見あたらないし。
0206デフォルトの名無しさん
2010/01/30(土) 18:29:08英語で検索すれば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)が経験則らしい
0207デフォルトの名無しさん
2010/01/30(土) 18:31:33コンパイル通らないのに動的解決、静的解決の話ができると思ってるの?
何のつもり?
0208デフォルトの名無しさん
2010/01/30(土) 18:36:58そっちの話とは全然関係ないけど、コンパイル通らないコードを乗せたのは
本人がおおよその理論を分かってるからとおっしゃってるからです
0209デフォルトの名無しさん
2010/01/30(土) 18:42:250210デフォルトの名無しさん
2010/01/30(土) 18:53:28こりゃコンパイル通らないわな。
でも意図は伝わる。
0211デフォルトの名無しさん
2010/01/30(土) 19:44:29>205
問題解決しました。<string>インクルードしてなかったw
stirngの小さな謎は残ったけど、質問とは関係ないので問題解決ってことで。
0212デフォルトの名無しさん
2010/01/30(土) 20:01:470213デフォルトの名無しさん
2010/01/30(土) 21:18:51仮想関数呼び出しについては確かにその通りだね。
でも、仮想関数テーブルの生成(オーバーライドの動的解決)
はコンストラクト時に発生するからオーバヘッドはどっちにしろ
「ある」。
0214デフォルトの名無しさん
2010/01/30(土) 21:31:12"多重継承を使えば、プログラム内の共通基底クラスに対する
依存を導入せずに兄弟クラスで情報を共有できる。"がわかりません。
これは何を言っているのでしょうか?
0215デフォルトの名無しさん
2010/01/30(土) 21:54:580216デフォルトの名無しさん
2010/01/30(土) 22:15:44「仮想関数のコストがこのプログラムの最大のボトルネックである!」
と結論づけられるほど洗練しきったプログラムを見たことがないぞ!
みなさんもそう思う・・・よな?
0217デフォルトの名無しさん
2010/01/30(土) 22:43:05まあ、forの中に書かなければ、仮想関数のコストは無視できるだろう。
0218デフォルトの名無しさん
2010/01/30(土) 22:55:20あれで仮想関数のコストがボトルネックになっているという話は聞いたことがない
こんな些細なコストを改善するよりいくらでもやることがあるだろう
0219デフォルトの名無しさん
2010/01/30(土) 22:59:270220デフォルトの名無しさん
2010/01/30(土) 23:05:57うむ。
そこまで突き詰めたら、あとは家に帰るか、
次のプロジェクトにさっさととりかかるべきだ。
0221デフォルトの名無しさん
2010/01/30(土) 23:06:12そのクラスのメンバと"フレンド"からアクセスできる。と言ってるのにその直後
なお、クラスから派生したクラスメンバと"フレンド"からアクセスできるようにするためには、privateでなくprotectedとしなければなりません
一体フレンドはどうすればいいのかよくわかりません
0222デフォルトの名無しさん
2010/01/30(土) 23:06:22すごいインパクトあるよ
0223デフォルトの名無しさん
2010/01/30(土) 23:14:29フレンドはprivateとprotectedとpublicにアクセスできるから何もしなくてもいい。
0224デフォルトの名無しさん
2010/01/30(土) 23:30:160225デフォルトの名無しさん
2010/01/30(土) 23:31:52友達の友達は、友達ではない
0226デフォルトの名無しさん
2010/01/30(土) 23:35:36とりあえず今はまだ、フレンドを使うようなプログラムではないので皆さんの意見を
参考に頭の隅に入れておきます
0227デフォルトの名無しさん
2010/01/30(土) 23:37:06Effective C++であったみたいなやつ。
クラス間ではほとんど使わないなぁ。
pimplくらいか?
0228227
2010/01/30(土) 23:38:11あと、お前の言い回しはちょっと失礼にあたるかも。
> 素早い返答
> 皆さんの意見を参考に頭の隅に入れて
この2つは危険だから以後気をつけるように。
どう危険かは自分で考えよう。
0229デフォルトの名無しさん
2010/01/30(土) 23:45:180230デフォルトの名無しさん
2010/01/30(土) 23:47:38cppunitを使わないから分からんなぁ。
cppunitって便利なのだろうか。
0231デフォルトの名無しさん
2010/01/31(日) 00:19:24改めて見ると確かにえろそうな文章ですね・・・
すいませんでした、今後注意します
0232デフォルトの名無しさん
2010/01/31(日) 00:22:12"えろそう"→"偉そう"です
申し訳ないです
0233デフォルトの名無しさん
2010/01/31(日) 00:53:05boost::shared_ptrのdeleterとかには良く使うなぁ。
0234デフォルトの名無しさん
2010/01/31(日) 00:58:390235デフォルトの名無しさん
2010/01/31(日) 01:16:11class 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;
};
0236デフォルトの名無しさん
2010/01/31(日) 01:21:100237デフォルトの名無しさん
2010/01/31(日) 01:32:41{
class Bar
{
};
friend Bar;
};
こういう形はときどき使いたくなる
0238デフォルトの名無しさん
2010/01/31(日) 01:35:50{
class Bar
{
friend Foo;
};
};
逆だった
0239デフォルトの名無しさん
2010/01/31(日) 02:40:31ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#45
0240デフォルトの名無しさん
2010/01/31(日) 02:55:17ありゃ?今 CD1 ってことは C++2003 だとまだダメな( friend が要る)のか。ごめん。
0241デフォルトの名無しさん
2010/01/31(日) 06:28:48ダイアモンド継承時の仮想継承のことじゃないか?
http://www.geocities.jp/ky_webid/cpp/language/033.html
0242デフォルトの名無しさん
2010/01/31(日) 13:23:18そう言われてもう一度読み直してみたら理解できました。
ありがとうございました。
0243デフォルトの名無しさん
2010/01/31(日) 13:35:04実際Java/C#/その他のいくつかのオブジェクト指向言語は
多重継承捨ててるしな
多重継承を持ってる言語は他にはEiffelとかSmalltalkとか
そんなのしかないな
Java/C#はインターフェースを使えば似たような事が出来るけど
0244デフォルトの名無しさん
2010/01/31(日) 13:37:590245デフォルトの名無しさん
2010/01/31(日) 13:50:07これじゃないと実装が困難っていうようなコードなんてあるの?
0246デフォルトの名無しさん
2010/01/31(日) 14:00:35ごくたまーにある
D&Eを読んで見ればわかる
それとデモンストレーションにiostreamにも使われている
0247デフォルトの名無しさん
2010/01/31(日) 14:06:500248デフォルトの名無しさん
2010/01/31(日) 14:21:29ある。
どっかで見た。
でも使ったことない。
0249デフォルトの名無しさん
2010/01/31(日) 15:14:31struct 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の動作が正しいんだよね?
0250デフォルトの名無しさん
2010/01/31(日) 15:17:380251デフォルトの名無しさん
2010/01/31(日) 15:18:570252デフォルトの名無しさん
2010/01/31(日) 15:19:580253デフォルトの名無しさん
2010/01/31(日) 15:20:15だよね
0254デフォルトの名無しさん
2010/01/31(日) 15:21:12失礼
0255デフォルトの名無しさん
2010/01/31(日) 15:30:08それ既知のバグだよ
M$は直す気がないらしい
なぜならATLをそのバグに依存して書いてしまってあるからだと
0256デフォルトの名無しさん
2010/01/31(日) 15:31:41MSってクソだな。
0257デフォルトの名無しさん
2010/01/31(日) 15:33:21このように、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の方が効率はいいのでしたらそっちにしようかなぁと。
よろしくお願いします。
0258デフォルトの名無しさん
2010/01/31(日) 15:38:03いやいや物は考えよう
MSDNのどっかにバグについて書いてあったと思う
失念してしまったが
バグを正式に認めているんだから、それを避けて書けば
いいだけの話だし
0259デフォルトの名無しさん
2010/01/31(日) 15:44:25そうでもないよ。
言語拡張切れば普通にエラー出るはず。
ATLと同時に使う場合も単にコンパイル単位分ければいいだけ。
0260デフォルトの名無しさん
2010/01/31(日) 15:44:55認めたバグは許されるのか?
そんな楽な仕事俺もやりたいよ!
そんなんいちいち認めていったら、
独自言語が完成するじゃないか。
0261デフォルトの名無しさん
2010/01/31(日) 15:45:03えー
でも、そ知らぬ顔して優しくMSにバグレポートしてあげました。
0262デフォルトの名無しさん
2010/01/31(日) 15:45:400263デフォルトの名無しさん
2010/01/31(日) 15:46:25理論の話を言いたいんだろjk
実測は最終手段。
0264デフォルトの名無しさん
2010/01/31(日) 15:48:220265デフォルトの名無しさん
2010/01/31(日) 15:50:46言語拡張オフ(/Zaオプションつける)にしてもかわんなかったYO!
0266デフォルトの名無しさん
2010/01/31(日) 15:53:18> 実測は最終手段。
はぁ?
どうせ最後には実測が必要なんだから、最初にやりゃいいんだよ。
それとも、想像で入れた高速化を効果の確認もせずにコミットするつもりなのか?
0267デフォルトの名無しさん
2010/01/31(日) 15:56:39> の方が効率は上がるのでしょうか?
...
> もしコード2の方が効率はいいのでしたらそっちにしようかなぁと。
理論なんて聞かれてませんが。
0268デフォルトの名無しさん
2010/01/31(日) 16:00:38ttps://connect.microsoft.com/VisualStudioJapan/feedback/details/529603/
今後のMSの動きにご期待ください!
0269デフォルトの名無しさん
2010/01/31(日) 16:11:00>>264
それではコード1とコード2、
どちらが効率いいのでしょうか?
0270デフォルトの名無しさん
2010/01/31(日) 16:17:020271デフォルトの名無しさん
2010/01/31(日) 16:19:38特に対策とか今後の具体的な方針とかなしに終わった。
0272202
2010/01/31(日) 19:53:42参考に頑張ってみます。
0273デフォルトの名無しさん
2010/01/31(日) 20:13:29>Smalltalkには多重継承はないな
最近はTraitsってのがあるんですよ。デフォで採用しているのはSqueakだけですが。
http://scg.unibe.ch/research/traits
0274デフォルトの名無しさん
2010/02/01(月) 09:01:190275デフォルトの名無しさん
2010/02/01(月) 09:08:090276デフォルトの名無しさん
2010/02/01(月) 09:31:440277デフォルトの名無しさん
2010/02/01(月) 09:37:220278デフォルトの名無しさん
2010/02/01(月) 10:16:20保障されてないよ。
たとえば、こんなときとか!(まぁ質問したいことと関係ない気もするけど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;
}
0279デフォルトの名無しさん
2010/02/01(月) 10:22:33ありがとうございます!
とても参考になる意見でした!
>>275
消えろカス
0280デフォルトの名無しさん
2010/02/01(月) 10:23:33かたよってるなあ
0281デフォルトの名無しさん
2010/02/01(月) 10:35:05消えろヴォケ
0282デフォルトの名無しさん
2010/02/01(月) 11:12:18愛してる
0283202
2010/02/01(月) 12:49:14どなたか助けてもらえませんでしょうか?
このような聞き方は良くないと思いますがどうかよろしくお願いします。
参考URL: (ttp://mikilab.doshisha.ac.jp/dia/research/report/2008/1118/002/report20081118002.html)
0284デフォルトの名無しさん
2010/02/01(月) 12:56:430285デフォルトの名無しさん
2010/02/01(月) 13:05:29このコンストラクタの引数の型って何なんでしょうか
参照の参照?ではないですよね
shared_ptr( shared_ptr && r ): px( r.px ), pn() // never throws
{
pn.swap( r.pn );
r.px = 0;
}
0286デフォルトの名無しさん
2010/02/01(月) 13:22:420287202
2010/02/01(月) 13:37:52まったくと言っていいほどいじれていませんが…
#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)が経験則
0288デフォルトの名無しさん
2010/02/01(月) 13:42:21なるほど、C++xxで導入される機能なわけですか
右辺値参照と左辺値参照の型が異なるってことは
実用的なクラスを書くために
書かないといけないオーバーロードが増えるってことですね
ある程度C++が使える人はいいけど
新規にC++の世界に入る人のことを思うと
なんかこう、ぞわぞわします
0289デフォルトの名無しさん
2010/02/01(月) 13:52:14これだと一時オブジェクトを作らなければならない場合が減るので
今まで無駄なコピーが必要だったクラスの四則演算などが効率化
されそう
0290デフォルトの名無しさん
2010/02/01(月) 14:07:25まさか /*保留*/ とか for(/* 〜 */) なんてのが、そのままで動くと思っていたのか
まずC言語を勉強しよう
0291202
2010/02/01(月) 14:12:33そこの部分も含めてどうすればよいのか教えて下さると助かります。
0292デフォルトの名無しさん
2010/02/01(月) 14:33:190293デフォルトの名無しさん
2010/02/01(月) 14:36:02ハハ
(゚ω゚)
/ \
((⊂ ) ノ\つ))
(_⌒ヽ
丶 ヘ |
εニ三 ノノ J
せめてこっちへ池
http://pc12.2ch.net/test/read.cgi/tech/1263824755
0294デフォルトの名無しさん
2010/02/01(月) 14:38:580295202
2010/02/01(月) 14:39:59ありがとうございました。
0296デフォルトの名無しさん
2010/02/01(月) 14:44:47使える場合も結構限られてるしな
0297デフォルトの名無しさん
2010/02/01(月) 15:08:250298デフォルトの名無しさん
2010/02/01(月) 16:15:36おこった場所特定する方法無い?
エラー箇所がわかるんだけど、STLのソースが出てくる。
その前の自作コードの位置=呼び出し先がわかりたい。
エニー箇所ではなく[]を使ったところ。
0299デフォルトの名無しさん
2010/02/01(月) 16:18:52出力みながら確認するっていう方法取っていたんだが
ソースに挟み込む、取り除くのが一苦労
間違って余分消したりすると、余計なエラーも発生する可能性あるし。
0300デフォルトの名無しさん
2010/02/01(月) 16:26:080301デフォルトの名無しさん
2010/02/01(月) 16:28:19デバッグでもprintfが不要になる場合もあるんです。
速度低下して先に進めなくなるので。
[]の呼び出し元だけ特定できればいいのですが。
0302デフォルトの名無しさん
2010/02/01(月) 16:32:12at()に変えてコンパイル
例外が出る
0303デフォルトの名無しさん
2010/02/01(月) 16:33:49#ifdef _DEBUG
0304デフォルトの名無しさん
2010/02/01(月) 16:39:48ということで、ツールの使い方はスレ違いにつきVCスレへどうぞ。
0305デフォルトの名無しさん
2010/02/01(月) 16:41:13マクロ経由でつかいましょ
0306デフォルトの名無しさん
2010/02/01(月) 16:52:33呼び出し履歴みてみます
0307デフォルトの名無しさん
2010/02/01(月) 17:59:450308デフォルトの名無しさん
2010/02/01(月) 19:54:51これか。
o = ら
i(oの隣) = に
ほんとだー
0309デフォルトの名無しさん
2010/02/01(月) 20:08:38開発中のソースツリーはそのままでこれをコピーしてそれにprintf()を
組み込んでデバッグするとデバッグコードを取り除くかわりに
コピーを削除するだけでいいよ。
0310デフォルトの名無しさん
2010/02/01(月) 22:51:51webで検索したけど見つからないです。
0311257
2010/02/01(月) 23:28:022 ttp://codepad.org/8o6YwVQM
これでアセンブラコードを出力させてみましたところ、
どちらも違うコードとなりました。
(VC++, g++, bccで最適化有効にして確認。)
そのアセンブラファイルサイズは
g++, bccでは2のコードが1より小さく
VC++では1のコードが2より小さく
なりました。
意味的には同じだと思うのですが、
どうして違うasmに帰着してしまうのでしょうか?
0312デフォルトの名無しさん
2010/02/02(火) 00:46:26最適化なんてそれこそコンパイラの癖や気分が最も出やすい所で
別の組織で別々に開発されたコンパイラの最適化の結果が同じになる方がおかしい
0313デフォルトの名無しさん
2010/02/02(火) 00:58:38最適なコードが得られるまで延々と時間をかけるわけにはいかないので
現実的なコンパイル時間内でなるべくより良いコードを生成するっていうくらいだ
0314デフォルトの名無しさん
2010/02/02(火) 01:05:23C/C++での表現がどんなアセンブラコードに当たるかなんて解釈次第
googleの翻訳とexciteの翻訳で同じ英文が出てこないと言ってるのと一緒
>>311はよくわかってなさそうだから付け加えておくと
小さいコードが速いコードとは限らないからね
0315デフォルトの名無しさん
2010/02/02(火) 07:26:14> 別の組織で別々に開発されたコンパイラの最適化の結果が同じになる方がおかしい
そういう意味ではありません。
>>313-314
そうですか。ありがとうございます。
0316デフォルトの名無しさん
2010/02/02(火) 13:56:07そういう意味じゃん。
0317デフォルトの名無しさん
2010/02/02(火) 16:17:37頭悪そうじゃんコイツ
0318デフォルトの名無しさん
2010/02/02(火) 16:35:570319デフォルトの名無しさん
2010/02/02(火) 16:37:110320デフォルトの名無しさん
2010/02/02(火) 16:53:220321デフォルトの名無しさん
2010/02/02(火) 16:56:490322デフォルトの名無しさん
2010/02/02(火) 17:05:06言うまでもなく、xが「頭が悪い人」なら自称非xは「自称頭が悪くない人」であり、
そこには頭が良い人だけでなく、この世の大多数を占める凡人も含まれる。
だから確率的にいって、この凡人の立場から言ってるのだろうと考えるのが普通だけど、
頭の悪い人がのぼせると、頭が悪い人と良い人の2種類しか想定しない>>320の切り返しが炸裂する。
0323デフォルトの名無しさん
2010/02/02(火) 17:17:110324デフォルトの名無しさん
2010/02/02(火) 17:19:250325デフォルトの名無しさん
2010/02/02(火) 17:21:440326デフォルトの名無しさん
2010/02/02(火) 17:22:550327デフォルトの名無しさん
2010/02/02(火) 17:26:070328デフォルトの名無しさん
2010/02/02(火) 17:27:01まったく同じ意味のコードが違うコードを生成するという
単純な驚きじゃないですか?
0329デフォルトの名無しさん
2010/02/02(火) 17:35:42微妙にズレた引用がお約束で良い感じです。
0330デフォルトの名無しさん
2010/02/02(火) 17:56:47殺伐とするならもっと殺伐としろよ、できないならいつもの流れに戻れ。
クズ共が。
0331デフォルトの名無しさん
2010/02/02(火) 18:03:280332デフォルトの名無しさん
2010/02/02(火) 18:56:12だから馬鹿
0333311
2010/02/02(火) 19:37:49バカにも分かりやすく解説しますと
> 1 ttp://codepad.org/mFAHo8Y3
> 2 ttp://codepad.org/8o6YwVQM
> 「どちらも」
->比較対象は2つ
これ以外のところからも比較対象は2つであることがわかる。
> g++, bccでは2のコードが1より小さく
> VC++では1のコードが2より小さく
> なりました。
一方バカな>>312は以下の様な恥ずかしいカンチガイをさらけだしてくれた。
> 別の組織で別々に開発されたコンパイラの最適化の結果が同じになる方がおかしい
そんなこと誰も言ってないのに。
いったい誰に反論しているのだろうか?
どう?分かった?無知な>>312さんwww
0334デフォルトの名無しさん
2010/02/02(火) 19:49:37ヘッダにだけ#includeって書けばいいの?
0335デフォルトの名無しさん
2010/02/02(火) 19:50:20そんなことないよ。
宣言は何回あってもいいんだよ。
0336デフォルトの名無しさん
2010/02/02(火) 19:54:46ふつうはインクルードガードされてるから大丈夫
0337デフォルトの名無しさん
2010/02/02(火) 19:54:53C言語編 第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
こっちの方がいいかもね。
0338デフォルトの名無しさん
2010/02/02(火) 19:56:04ちなみに
>何回あってもいくない宣言
ってなんですか?
0339デフォルトの名無しさん
2010/02/02(火) 20:12:13typedefはいいんだっけ・・?
0340デフォルトの名無しさん
2010/02/02(火) 20:24:37宣言じゃないのでは?
0341デフォルトの名無しさん
2010/02/02(火) 20:25:440342デフォルトの名無しさん
2010/02/02(火) 20:28:38>意味的には同じだと思うのですが、
>どうして違うasmに帰着してしまうのでしょうか?
こんな馬鹿なこと聞いてたから、「意味的に同じコードは(どんなコンパイラでも)同じasmに帰着する」みたいな
どうしようもない絶望的な勘違いをしてるんじゃないかと思っただけ
そうじゃないならいいよ
別のひどい勘違いはしてたみたいだが
0343デフォルトの名無しさん
2010/02/02(火) 20:34:48____
/ \ /\ キリッ
. / (ー) (ー)\ <「>>342そうじゃないならいいよ」
/ ⌒(__人__)⌒ \
| |r┬-| |
\ `ー’´ /
ノ \
/´ ヽ
| l \
ヽ -一””””~~``’ー?、 -一”””’ー-、.
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
____
/_ノ ヽ、_\
ミ ミ ミ o゚((●)) ((●))゚o ミ ミ ミ <だっておwww
/⌒)⌒)⌒. ::::::⌒(__人__)⌒:::\ /⌒)⌒)⌒)
| / / / |r┬-| | (⌒)/ / / //
| :::::::::::(⌒) | | | / ゝ :::::::::::/
| ノ | | | \ / ) /
ヽ / `ー’´ ヽ / /
| | l||l 从人 l||l l||l 从人 l||l バンバン
ヽ -一””””~~``’ー?、 -一”””’ー-、
ヽ ____(⌒)(⌒)⌒) ) (⌒_(⌒)⌒)⌒))
0344デフォルトの名無しさん
2010/02/02(火) 20:41:010345334
2010/02/02(火) 20:49:28ありがとうございます
ヘッダーで#includeしてもいいんだけど、
他のヘッダーとの間で名前が衝突してしまうってだけの話でおk?
あと、コンパイル速度が遅くなる程度
0346デフォルトの名無しさん
2010/02/02(火) 20:51:01迷惑だろ
0347デフォルトの名無しさん
2010/02/02(火) 20:52:16ソースでしか使わない場合はソースで
0348デフォルトの名無しさん
2010/02/02(火) 21:02:19貼らずにいられなかったんでしょ、悔しくて。
0349デフォルトの名無しさん
2010/02/02(火) 21:14:55thx
0350デフォルトの名無しさん
2010/02/02(火) 21:21:46外してるかもしれないけど、
名前の衝突ってのが「複数回定義されているシンボルが・・」や
「再定義されました」みたいなエラーのことをさすなら
宣言と定義をごっちゃにしてるんだと思う
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;
0351デフォルトの名無しさん
2010/02/02(火) 21:23:16a.cpp
#include "main.h"
main.cpp
#include "main.h"
main.h
#pragma once
int global_a;
0352デフォルトの名無しさん
2010/02/02(火) 21:49:410353デフォルトの名無しさん
2010/02/02(火) 21:58:24あんまり可笑しいもんで、嗤っちゃっただけだww
0354デフォルトの名無しさん
2010/02/02(火) 22:04:08僕はとっても冷静ですポーズ。
0355デフォルトの名無しさん
2010/02/02(火) 22:06:09お前消えろカス
>>354
お前も消えろカス
0356デフォルトの名無しさん
2010/02/02(火) 22:08:43お前に聞きたい。
お前も可笑しいとは思わないか?
だって>>333はバカがカンチガイしないように2つも
安全ネットを張ってあげてたんだぜ?
そして その2つの安全ネットをぶち破るバカが存在したんだぞ?
お前も可笑しいとは思わないか?
0357デフォルトの名無しさん
2010/02/02(火) 22:23:44本人にしか効能のわからない典型的な電波レスになってるよね。
0358デフォルトの名無しさん
2010/02/02(火) 22:29:07あんなの書かれたら質問者は根本的な勘違いをしてると思うもんだ
0359デフォルトの名無しさん
2010/02/02(火) 22:34:33何?>357のレスは自己再帰的なの?
0360デフォルトの名無しさん
2010/02/02(火) 22:36:31制御できないと思いますが、
Test::Test() : Value(1)
{
};
このValue(1)もコンストラクタ呼出順に影響するんでしょうか?
ついでにこれの呼び方を教えてほしいです。
0361デフォルトの名無しさん
2010/02/02(火) 22:40:37バカなお前はもう一度同じ事言われたいの?
0362デフォルトの名無しさん
2010/02/02(火) 22:46:55コンストラクタ呼び出し順ってなに?
Value(1)みたいなのは初期化リストっていって
そこに書いた順序ではなく
クラスのメンバとして宣言した順序で初期化されることが決まってる
0363デフォルトの名無しさん
2010/02/02(火) 22:52:25「staticなクラスを宣言」というのが掴みづらいんだけど、全体から推測するに、
cppファイルの関数外の場所で、static Test test; みたいにインスタンスを生成する時の話がしたいのかな?
その例のValue(1)は、TestクラスのValueというメンバ変数を初期化している。
呼び方は、とりあえず「メンバ変数の初期化」って呼んでおけば誤解は無いはず。
メンバ変数の初期化は、キミが訊きたい(のであろう)コンストラクタ呼出順の話とは関係ないよ。
0364デフォルトの名無しさん
2010/02/02(火) 22:53:22>>359
>>361
>>357
>>358
>>356
>>355
>>354
>>353
0365デフォルトの名無しさん
2010/02/02(火) 22:55:50そいつにいつまでも構うクソみたいな奴も黙れ
0366デフォルトの名無しさん
2010/02/02(火) 22:57:42レスする=その話題が伸びることを支持し、火に薪をくべる
レスしない=その話題が伸びないことを支持し、火の勢いに一切手を貸さず鎮火を願う
お前は根本的に分裂している
0367デフォルトの名無しさん
2010/02/02(火) 22:58:08そいつらにかまうお前は黙らなくていいのか。
あと、そういうことを書くなら安価しろ
0368デフォルトの名無しさん
2010/02/02(火) 22:58:37あんたが天才なことはよくわかったから
今後は自分をバカに見せるような質問の書き方はしないようにしようぜ
0369デフォルトの名無しさん
2010/02/02(火) 22:59:24大人気だなw
0370デフォルトの名無しさん
2010/02/02(火) 23:00:39> そいつにいつまでも構うクソみたいな奴
これって、どうも複数人vs複数人に見えるのは俺だけだろうか?
両陣営ともなんか一人じゃない用な気がする。
ってどうでもいいレスをしてみるテスト
0371デフォルトの名無しさん
2010/02/02(火) 23:01:430372デフォルトの名無しさん
2010/02/02(火) 23:02:020373デフォルトの名無しさん
2010/02/02(火) 23:02:300374デフォルトの名無しさん
2010/02/02(火) 23:08:15言いたいこと言って、テスト付けて精神的に逃げるのはタチ悪いぜ。
0375デフォルトの名無しさん
2010/02/02(火) 23:16:110376デフォルトの名無しさん
2010/02/03(水) 00:39:090377デフォルトの名無しさん
2010/02/03(水) 07:24:59稚拙なレスですね。
これから小学校ですか?
0378デフォルトの名無しさん
2010/02/03(水) 10:46:43「釣り針」ブロック
}
catch() {
「私でも釣れた!」ブロック
}
finally {
「水中に引き込まれて溺れる」ブロック
}
0379デフォルトの名無しさん
2010/02/03(水) 10:54:470380デフォルトの名無しさん
2010/02/03(水) 10:58:100381デフォルトの名無しさん
2010/02/03(水) 11:23:26B *b_;
SetB(B *b);{b_=b;}
};
struct B{
A a;
B(){ a.SetB( this ); }
};
こういう、コンポジションされる側とする側の依存って一般的?
こういうことしたいってなった時点で設計ミスを疑うべき?
0382デフォルトの名無しさん
2010/02/03(水) 11:56:33片方必要とされる側は必要とする側に関知しないように作れば
そちら側は再利用できるのに
0383デフォルトの名無しさん
2010/02/03(水) 12:12:04そういううののタメにweak_ptrとかあるわけだし
0384デフォルトの名無しさん
2010/02/03(水) 13:41:18GoFのデザパタで?
0385381
2010/02/03(水) 13:42:38とりあえず後で調べるから、悪いけど>>383すまん。
上記みたいな設計になっちゃった場合、
A <-> C <-> B
こんな感じで間に第三者を挟めばいいのか?
スレチですまん
0386デフォルトの名無しさん
2010/02/03(水) 15:56:41Double.isNaN(d)
Double.isInfinite(d)
にあたるものはC++では何でしょうか
#infや#indだと検索しにくくて困ってます
0387デフォルトの名無しさん
2010/02/03(水) 16:35:190388デフォルトの名無しさん
2010/02/03(水) 16:49:18bool isNaN(double d) { return d != d; }
bool isInfinite(double d) { return d < DBL_MIN || d > DBL_MAX; }
移植性?
(゚�听)シラネ
0389デフォルトの名無しさん
2010/02/03(水) 16:55:180390デフォルトの名無しさん
2010/02/03(水) 18:46:000391デフォルトの名無しさん
2010/02/03(水) 20:24:57std::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/
0392デフォルトの名無しさん
2010/02/03(水) 20:45:47has_infinityは型(doubleとか)が∞を表現として持つかのbool値だし
infinity()
quiet_NaN()
は値としての#INFなどの表現を直接得るものだし
結局処理系依存の
#include <float.h>
_isnan( val )
_finite( val )
gcc
#include <math.h>
int isnan(x);
int isinf(x);
これらを使うしかないんじゃ
0393デフォルトの名無しさん
2010/02/03(水) 21:09:31既にC99で規格化されてるものなんで、
C++0xで正式に入ることことも決まってるし使っちゃっておkじゃね
0394デフォルトの名無しさん
2010/02/03(水) 21:13:30将来的には、C++0xで定義される見込み。C99ではすでに存在するんだけど……。
0395391
2010/02/03(水) 21:23:13> 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。
0396デフォルトの名無しさん
2010/02/03(水) 22:14:160397391
2010/02/03(水) 23:45:27色々と間違えた
bool isInfinite(double d) : d==std::numeric_limits<double>::infinity()ならtrueを返す。そうでないならfalse。
bool isNaN(double d) : d!=dならtrueを返す。そうでないならfalse。
でおkね。
0398デフォルトの名無しさん
2010/02/03(水) 23:53:140399デフォルトの名無しさん
2010/02/04(木) 01:34:020400デフォルトの名無しさん
2010/02/04(木) 10:56:030402デフォルトの名無しさん
2010/02/04(木) 20:09:050403デフォルトの名無しさん
2010/02/04(木) 20:11:230404デフォルトの名無しさん
2010/02/04(木) 20:17:57バブー?
0405デフォルトの名無しさん
2010/02/04(木) 20:30:070406デフォルトの名無しさん
2010/02/04(木) 20:43:150/0や±∞/±∞、0・±∞などがある。
これらが“数ではない”ものとして扱われるそもそもの理由とは
離散数学における数という概念が「量ではなく任意の長さの単位の倍数」という
古代ギリシャで起こった極めて初歩的な概念を継承している部分にあり、
上述した演算が定義されない事に因む。
更に物理学の要請から解析学が生まれ、解析学は演算対象の任意の有限区間の非加算濃度を要求した。
これは実数体に他ならない。有理数体の稠密性は実数体の超越表現の結果である。
それを浮動小数点数と言った稠密性のある体へ表現を拡大していったときにまだこれらの量を否定する考えが存在するなどと言う事はあってはならない。
0407デフォルトの名無しさん
2010/02/04(木) 20:43:250408デフォルトの名無しさん
2010/02/04(木) 20:59:45え?
なんなの?
0409デフォルトの名無しさん
2010/02/04(木) 21:22:34stdcallやcdeclに比べてfastcallって呼び出しが速くなるの?
エロい人教えてー><
0410デフォルトの名無しさん
2010/02/04(木) 21:38:16知識や方法などを教えてください。
0411デフォルトの名無しさん
2010/02/04(木) 21:56:02初歩的なものからならリンクリストは必須。
現代的なものだと多相性とかかな。(boost.variant)
>>409
引数がレジスタを介してサブルーチンに渡されるから速い。
0413デフォルトの名無しさん
2010/02/05(金) 01:03:25流れぶった切りですが質問です。
C++で利用できるSVG形式の読み込み〜描画ができるライブラリを探してるんですが、いいのありますか?
0414デフォルトの名無しさん
2010/02/05(金) 01:24:43ベータ ver. ダウンロード期間中だけど
いつ頃まで c++が正常に作動するのか?
0415デフォルトの名無しさん
2010/02/05(金) 01:33:37対象の変数は0未満にならず、上限もint型の範囲内とします。
もし推奨されないなら良い方法を教えてくれませんか。
0416デフォルトの名無しさん
2010/02/05(金) 01:34:55範囲内だと保証できるのなら問題ないよ。
0417デフォルトの名無しさん
2010/02/05(金) 01:36:20ありがとうございます!
0418デフォルトの名無しさん
2010/02/05(金) 01:56:510419デフォルトの名無しさん
2010/02/05(金) 02:05:01private以外の変数もポインタだらけだ
0420デフォルトの名無しさん
2010/02/05(金) 06:55:38例えば関数テンプレート
template<class T>
T foo(const T& arg){〜〜}
だと、そのテンプレート引数Tにどんな型をクライアントが入れてくるか定まらな
いため、fooを作る側の私としてもどうにも基本保証すらできません。
よろしくお願いします。
0421デフォルトの名無しさん
2010/02/05(金) 07:26:32強い保証が提供できないなら、その旨ドキュメント化しておかないと呼び出し元の
想定しない状態を作って問題を起こす可能性がある。
基本保証すら提供しないのはほとんどバグだと思われても仕方が無いレベル。
この場合は例外を発生させないための条件を事前条件としてしまったほうがマシかもしれない。
0422デフォルトの名無しさん
2010/02/05(金) 09:38:480423420
2010/02/05(金) 14:34:30ありがとうございます。
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)
は両方ともこのままでは例外非安全ということでしょうか?
0424デフォルトの名無しさん
2010/02/05(金) 15:34:43このコードの結果で、
delete前はnum1〜num6まで全て有効であり、
delete後はnum1とnum4だけが有効で、num2, num3, num6は無効(値を利用したら未定義の動作)である。
という理解で宜しいでしょうか?
codepadではこのようになるようですが、
標準C++準拠な他のコンパイラでも成り立ちますか?
よろしくお願い申し上げます。
0425デフォルトの名無しさん
2010/02/05(金) 16:49:05NO。
その場合Tが投げる例外をMyTemplateClassがcatchしたとして
一体どうしろと?
0426420
2010/02/05(金) 17:30:33No.というのはつまり両方ともこのままでは
例外非安全ということでしょうか?
いったいどうすればMyTemplateClass::operator=(〜)で
基本保証ができますでしょうか?
0427デフォルトの名無しさん
2010/02/05(金) 17:33:560428デフォルトの名無しさん
2010/02/05(金) 17:44:56ドキュメントに
T型の変数が使っているメンバ関数を列挙し、
これらが例外を投げないとすれば
基本保証or強い保証or例外を投げません。
と書けばよいでしょうか?
0429デフォルトの名無しさん
2010/02/05(金) 18:22:31T型変数が常識的に考えて投げないだろうって
思う場合(operator=とかswapとか)は別にそこまで冗長に書かなくても
いいのでは?
自分で書いた部分でthrowしなければ
強い保証としていいんじゃないかなぁ。
0430デフォルトの名無しさん
2010/02/05(金) 19:15:210431デフォルトの名無しさん
2010/02/05(金) 19:57:56ttp://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!"
が正しい答えです。
日本語とまったく逆になるのです。
0432デフォルトの名無しさん
2010/02/05(金) 20:06:19コードがこれだけなら T の operator= と
MyTemplateClass の operator= の例外安全性は同じ
>例外非安全
んな言葉はありません
0433420
2010/02/05(金) 20:15:46ありがとうございます。
>>432
> > MyTemplateClass& operator=(const T& rhs){num=rhs;return *this;}
> コードがこれだけなら T の operator= と
> MyTemplateClass の operator= の例外安全性は同じ
Tにクライアントが何を入れるか分からない場合、
ドキュメントになんて書けば良いことになりますか?
0434デフォルトの名無しさん
2010/02/05(金) 20:29:23Tの詳細がMyTemplateClassにとって不明なんだから例外について
MyTemplateClassのドキュメントに書く必要がある事などないんだよ。
0435デフォルトの名無しさん
2010/02/05(金) 20:31:150436デフォルトの名無しさん
2010/02/05(金) 20:37:040437デフォルトの名無しさん
2010/02/05(金) 20:38:55理想論だな。現実を見ろ
じゃあ聞くけど>>423のMyTemplateClassで
お前ならどうやって例外安全を保証するの?
Tの詳細がMyTemplateClassにとって不明な状況だぞ。
0438デフォルトの名無しさん
2010/02/05(金) 20:44:59逆に聞くけど、>>423のMyTemplateClassのどこかに
例外安全じゃないところがありますか?
Tに何を与えるのかはクライアントの問題であって
MyTemplateClassには関係ないこと。
0439420
2010/02/05(金) 20:47:47みなさんありがとうございます。
MyTemplateClassをちゃんと(強い保証になるように)コーディングできていれば、
「強い保証です」と書いていいわけですね。
それでTがトンデモ仕様であったらそれはまた別問題ということなんですね。
0440>>420
2010/02/05(金) 20:49:36クラスの 全ての メンバ関数に対し、
「強い保証/基本保証 をします」
とドキュメントに記載していますか?
0441デフォルトの名無しさん
2010/02/05(金) 20:54:360442デフォルトの名無しさん
2010/02/05(金) 22:33:51強い保証は「成功」か「失敗したけど、完全に失敗前の状態にもどる」のどちらかしか起こらない
0443デフォルトの名無しさん
2010/02/05(金) 22:37:27> 基本保証はリソースをきっちり管理できてる
それに加えて、オブジェクト自身が何らかの有効な状態を維持している(どの状態かは問わない)
という条件が必要じゃなかったか?
> 強い保証は「成功」か「失敗したけど、完全に失敗前の状態にもどる」のどちらかしか起こらない
それはその通りだと思う。
>>441
されていない。
でも現在のC++の常識。
例えるならgotoを使いまくっているヤツを排除しただろ?
あれと同じ発想だ。(by Effective C++より)
0444デフォルトの名無しさん
2010/02/05(金) 22:42:382版と全然違うことがかいてあるじゃないか
まだ全然読んでないから読まんといけんな
0445デフォルトの名無しさん
2010/02/05(金) 22:53:16特に書かなければ、基本保証が前提だろう。
0447443
2010/02/05(金) 23:33:18ここには
>>442> 基本保証はリソースをきっちり管理できてる
と書かれているな。
Effective C++とどっちを信用すべきなんだ!?
0448デフォルトの名無しさん
2010/02/05(金) 23:44:250449デフォルトの名無しさん
2010/02/05(金) 23:45:010450デフォルトの名無しさん
2010/02/05(金) 23:51:11便所の落書き vs Scott Meyers先生
どっちが勝つと思うよ?
・・・って程度だろ。
0451デフォルトの名無しさん
2010/02/05(金) 23:53:06「私はネットのブログだかなんだかの定義にのっとりました!」
「私はEffective C++のScott Meyers先生の定義にのっとりました!」
どっちが良いかってことか。
・・・でもバカ上司にはどっちも通用しなさそうだwww
0452デフォルトの名無しさん
2010/02/06(土) 00:04:250453デフォルトの名無しさん
2010/02/06(土) 00:07:080454デフォルトの名無しさん
2010/02/06(土) 00:19:14世の中にあるドキュメントを参考にすればいいと思うんだ。
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 のどの操作の例外が外に飛んでくるかと例外安全性を記述。
後は適当に調べてくれ。
0455デフォルトの名無しさん
2010/02/06(土) 02:08:26強い例外保証が提供できていればぶっちゃけドキュメント付けは要らないと思う。
基本保証以下の場合は例外発生時の状態についてドキュメントで触れておくべきだと思う。
0458デフォルトの名無しさん
2010/02/06(土) 14:23:23パッと見constや参照の違いにょる挙動の違いを見ているだけだと思うけど、確認したいポイントは?
0459デフォルトの名無しさん
2010/02/06(土) 15:10:37delete後はコピーであるnum1とnum4は有効で、
それ以外は無効だろうと思っているのですが、
num2, num3, num6についてはconst参照で束縛すると挙動が変わったりするのか
という点が疑問でした。
0460424
2010/02/06(土) 15:17:23vc++
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については全て未定義の動作
(たまたま同じ値が出力されただけで、
結果が違うとかそういう問題じゃない)
ということでしょうか?
0461デフォルトの名無しさん
2010/02/06(土) 15:20:48はっきり言ってconstだろうとなかろうとnum2, num3, num6を評価した時点でプログラムがハングしても文句は言えないからな。
0462デフォルトの名無しさん
2010/02/06(土) 15:22:220463デフォルトの名無しさん
2010/02/06(土) 15:28:26文句を言いたい訳じゃねえんじゃね?
0464424
2010/02/06(土) 15:29:22ってヤツと混同してました。
ありがとうございました。
0465デフォルトの名無しさん
2010/02/06(土) 15:31:42鼻から悪魔
0466デフォルトの名無しさん
2010/02/06(土) 15:35:44>なんで、privateな変数はポインタだらけなの?
逆じゃね?ポインタ変数はprivateにして隠蔽するからじゃないか?
0467デフォルトの名無しさん
2010/02/06(土) 15:38:02num1がコピーされたインスタンス。
num2の生成にコピーは発生しない。
num2とp->numは同じインスタンス。同じ型。
num3の生成にコピーは発生しない。
num3とcp->numは同じインスタンス。
前者はconst修飾されていて変更不可、
cpはpointeeがconst修飾されているのでcpから得られるメンバは総じて変更不可。
num4はnum1と同じくコピー。
通常、コピーコンストラクタはconst referenceの仮引数であるので挙動に変化なし。
num5はnum3の理由によりコンパイルエラー。
参照は定義時に使われたインスタンスを指すオブジェクト。
num6はcp->numと同じインスタンス。但し変更されない事を宣言時に明示している。
よって型検査の上では正常。
いずれにせよ、参照は単にポインタの糖衣構文に過ぎずプログラマーが参照は図示を明記しなくても良いというだけ。
cons参照が特殊なのは壊れてないスタックにあるインスタンスをコピーコストなしで見られる点。
0468467
2010/02/06(土) 15:41:40単純にメモリがコピーされるだけの処理に置き換わる。
最適化によってはコピーが発生せず、変数宣言が消失したり関数がinlineされたりなどする。
この挙動の違いは非PODな型を使う時に最適化を考えて書く時に重要なものになる。
0469デフォルトの名無しさん
2010/02/06(土) 16:18:45逆じゃないの? テンポラリオブジェクトを束縛するにはconst参照でなくてはいけないけど、
const参照がテンポラリオブジェクトしか束縛できないというわけじゃないと思うけど。
仮変数とかでバリバリ使ってるし。
0470デフォルトの名無しさん
2010/02/06(土) 16:34:040471デフォルトの名無しさん
2010/02/06(土) 16:37:00それはコンパイラの実装に踏み込んだ余計な知識だろう。
一般的に言えるものじゃないので、そのレベルの最適化を考えるんなら自分の環境で
アセンブリリスト吐かせて確認するべき。
0472デフォルトの名無しさん
2010/02/06(土) 17:35:580473デフォルトの名無しさん
2010/02/06(土) 17:38:170474デフォルトの名無しさん
2010/02/06(土) 17:45:54副作用のない部分をよりコストの低い処理へと置き換える、という事は一般的だとは思うけど。
0475デフォルトの名無しさん
2010/02/06(土) 17:52:43うんうん。最適化って言うのはそういうものだね。
で?
0476デフォルトの名無しさん
2010/02/06(土) 17:53:33排除されているというべきだろう
C++で多態性(ポリモルフィズム)をするにはポインタを介するしか
ないわけだし
0477デフォルトの名無しさん
2010/02/06(土) 17:55:16静的に近い解決がされちゃうし
0478デフォルトの名無しさん
2010/02/06(土) 17:57:560479デフォルトの名無しさん
2010/02/06(土) 19:55:59これがネックになる人は PG どころか一般事務もダメだろ
顧客コードだの ID の類が管理できないわけで
自立した成人としての基礎的な能力に問題がある
0480デフォルトの名無しさん
2010/02/06(土) 20:10:450482デフォルトの名無しさん
2010/02/06(土) 20:56:08void test(hoge* h)に対して、test(&h);みたいな感じに
そのあとに、GUIのイベントループにさせたりするとして
0483デフォルトの名無しさん
2010/02/06(土) 21:02:37どうなるもこうなるも、普通で問題ないと思うのですが、どういう回答をお望みですか?
0484デフォルトの名無しさん
2010/02/06(土) 21:24:45>>482はポインタとアドレスを別物だと思っているんじゃないか?
いやある意味別物だけど。
・・・さすがにそういう意味じゃないかな。
0485482
2010/02/06(土) 21:29:16いまいち、そこら辺がわからない
0486デフォルトの名無しさん
2010/02/06(土) 21:36:35スコープが分からんとは。
自動変数とかそう言う話っぽいな。
誰か説明してやってくれ
0487482
2010/02/06(土) 21:44:15普通の変数や、newした変数の寿命はわかるのですが
普通の変数のアドレスを外部の関数に渡した場合と、
変数を使った場合がよくわからないんです
自分で調べたい所ですが、イマイチ方法がわからずorz
0488デフォルトの名無しさん
2010/02/06(土) 21:44:400489デフォルトの名無しさん
2010/02/06(土) 21:51:24適当にググってポインタについて勉強すれ。
0490デフォルトの名無しさん
2010/02/06(土) 22:06:34C言語なら俺に聞け(入門編)Part 60
ttp://pc12.2ch.net/test/read.cgi/tech/1264920499/
ここがいいんじゃない?
0491デフォルトの名無しさん
2010/02/06(土) 22:12:10普通じゃない変数があるのか?
0492デフォルトの名無しさん
2010/02/06(土) 22:25:20(2)変数を使った場合。
どういう状況を言っているのか全くわからん。
ひどすぎる。
0493デフォルトの名無しさん
2010/02/06(土) 22:44:27って何事w
今までC/C++で変数を使わないでプログラミングしたことねぇよ。
0494デフォルトの名無しさん
2010/02/06(土) 22:44:49スタックフレーム、駆動レコード、継続あたりの話ね。
「外部の関数」と考えると確かに判りづらいな。
まずは「呼び出し元の関数」と「呼び出し先の関数」というのを想像して、それぞれの
動きを見てみると良いかも。
C++の場合「呼び出し先の関数」が終わらないと「呼び出し元の関数」も終わらないから、
「呼び出し元の関数」にある変数も「呼び出し先の関数」が終わるまでは無くならない。
なので、変数の(スタックに積んである)ポインタを実変数として渡しても問題になることはないんだよね。
0496487
2010/02/06(土) 22:57:15わざわざ、丁寧な返答ありがとうございました
Qtとかのフレームワークでプログラミングをしたいなと思っていたので、
中身がブラックボックス化されていて頭がゴチャゴチャしていましたorz
えぇ〜と、周りに迷惑なのでこの話はここら辺で止めておきます
0497デフォルトの名無しさん
2010/02/06(土) 23:07:20> Qtとかのフレームワークでプログラミングをしたいなと思っていたので、
> 中身がブラックボックス化されていて頭がゴチャゴチャしていましたorz
Qt!?
悪いことは言わん。やめとけ。
いくらブラックボックスとはいえそのレベルじゃ使えないでしょ。
その前に猫のサイト等ででもC言語の勉強をすべきでは?
0498デフォルトの名無しさん
2010/02/06(土) 23:38:09えぇ、もちろん使えませんよ
いろいろと忙しくて、1ヶ月くらいしかC++の勉強をしてませんからね
1〜2年程度の長いサイクルで考えてるんで
0499デフォルトの名無しさん
2010/02/06(土) 23:39:42(struct Point { int X; int Y };とか)
をコピーするとき、一番早い方法ってなんですかね?
素直に=でコピーがいいんですか?
0500デフォルトの名無しさん
2010/02/06(土) 23:40:230501デフォルトの名無しさん
2010/02/06(土) 23:42:560502デフォルトの名無しさん
2010/02/06(土) 23:44:370503デフォルトの名無しさん
2010/02/07(日) 00:00:060504デフォルトの名無しさん
2010/02/07(日) 00:04:050505デフォルトの名無しさん
2010/02/07(日) 00:45:350506デフォルトの名無しさん
2010/02/07(日) 00:51:170507デフォルトの名無しさん
2010/02/07(日) 01:28:48STL流儀のbegin(),end()がまさにそれだろ。
iteratorはポインタの抽象だよ。
0508デフォルトの名無しさん
2010/02/07(日) 10:07:23CとC++は別物。焼きそばとカップ焼きそばくらい違う。
0509デフォルトの名無しさん
2010/02/07(日) 10:26:190510デフォルトの名無しさん
2010/02/07(日) 10:35:220511デフォルトの名無しさん
2010/02/07(日) 11:05:460512デフォルトの名無しさん
2010/02/07(日) 11:23:49ちょっとはみんな自重しようぜ。
0513デフォルトの名無しさん
2010/02/07(日) 11:29:550514デフォルトの名無しさん
2010/02/07(日) 12:41:01文字コードUTF-8 + 改行コードLF
で統一しているのですが、
BOMってヤツは付けた方が良いのでしょうか?
よろしくお願いします。
0515デフォルトの名無しさん
2010/02/07(日) 13:25:590516デフォルトの名無しさん
2010/02/07(日) 14:41:41abc() : member(0) {}
0517デフォルトの名無しさん
2010/02/07(日) 14:47:450518デフォルトの名無しさん
2010/02/07(日) 14:50:020519デフォルトの名無しさん
2010/02/07(日) 14:50:53そこにかかずしていつ初期化するのだい?
0520デフォルトの名無しさん
2010/02/07(日) 15:03:33C++なら文字コードは全部
"Shift JIS" + "CR+LF"
で統一するのがオススメ。(正確にはCP932か。)
現実的にこれなら扱えないコンパイラやOSはまず無い。
(M$様が圧倒的なシェアを持っている都合上
対応せざるを得ないんだろうな。)
日本語とか完全無しってのが理想だろうけどさ。
ってのが俺の持論なんだが。
賛成意見・反論など大募集。
0521デフォルトの名無しさん
2010/02/07(日) 15:07:48hoge() { member = 0; }
コンストラクタの中に書く俺は異常なのか・・・?
0522デフォルトの名無しさん
2010/02/07(日) 15:08:59異常というか、C++の初期化子の意味を理解してください。
・・・Effective C++すら読んでないでしょ。
0523デフォルトの名無しさん
2010/02/07(日) 15:10:03それ初期化やない、代入や。
0524デフォルトの名無しさん
2010/02/07(日) 15:11:150525デフォルトの名無しさん
2010/02/07(日) 15:12:39節子、それ、初期化やない、代入や!
って言おうと思ったら既に言われてしまった。
0526デフォルトの名無しさん
2010/02/07(日) 15:13:39お前もかよwこのスレは・・・。
Effective C++ぐらい読めよ。そして従えよ。
0527デフォルトの名無しさん
2010/02/07(日) 15:14:130528デフォルトの名無しさん
2010/02/07(日) 15:14:360529デフォルトの名無しさん
2010/02/07(日) 15:19:370530デフォルトの名無しさん
2010/02/07(日) 15:20:14どうでもいい場合は書かない。
0531デフォルトの名無しさん
2010/02/07(日) 15:21:12何の引数が無い場合?メンバ変数(クラス)ならそいつらのデフォルトコンストラクタで初期化しとけば良いじゃん。
0532デフォルトの名無しさん
2010/02/07(日) 15:24:21初期化のタイミングで値が決まるが、クラス内部で変更するつもりがない変数に有効。
0533デフォルトの名無しさん
2010/02/07(日) 15:29:21{
Test a;
public:
Hoge() {} // aはデフォルトでおk
};
別にこれなら初期化子はいらないよな
0534デフォルトの名無しさん
2010/02/07(日) 15:34:32組み込み型のメンバーは、boost::initialized_value<double> jissuu;にするから所期化忘れは無い。
0535デフォルトの名無しさん
2010/02/07(日) 15:34:33教えてくれ
0536デフォルトの名無しさん
2010/02/07(日) 15:36:380537デフォルトの名無しさん
2010/02/07(日) 15:38:230538デフォルトの名無しさん
2010/02/07(日) 15:38:360539デフォルトの名無しさん
2010/02/07(日) 15:39:14C#やってた人がやらかすな。
0540デフォルトの名無しさん
2010/02/07(日) 15:40:09はい。
それとVCしか使えない人もモグリです。
0541デフォルトの名無しさん
2010/02/07(日) 15:42:31メモリーリーク?なにそれ?おいしいの?
なんだSTLって使い物になるんじゃん。
MPLすげー。ソースコードが半分になるじゃん。
C++の世界が全く変わるよ。良い意味で。
0542デフォルトの名無しさん
2010/02/07(日) 15:44:15さすがにねぇ。。
>>541
> メモリーリーク?なにそれ?おいしいの?
いいすぎだろw
メモリーリークを知っているからこそ
役立つんだろ?
0543デフォルトの名無しさん
2010/02/07(日) 15:45:34使えるのはメモリー管理だけだろ。
それ以外たいして入らない。
メモリも他のライブラリで代替えすれば完全に入らない。
0544デフォルトの名無しさん
2010/02/07(日) 15:47:36いるか要らないかねぇだろ
本題を読めよw
0545デフォルトの名無しさん
2010/02/07(日) 15:48:07最初の行が矛盾してるぜ。
欲しいところだけ使いたいのに、全部入れるとでかすぎるって話なら同意。
0546デフォルトの名無しさん
2010/02/07(日) 15:50:39C++は初めてか?肩の力抜けよ。
* catch(...){ throw; }
落ち着け
* カスタムアロケータを自作したり等、STLをやっと使いこなせるレベル
頑張って^^;
* shared_ptrやMPL等でboostを導入しまくる
そうだよね保守性は重要だよね
* boostのソースから必要な部分だけもってきて改変
本当に分かってやってるのか?という懸念
0547535
2010/02/07(日) 15:53:20>>499
試したけど、コンパイラ定義の代入はmovで初期化されているな。
>>516
これはよくわからんかった。
0548デフォルトの名無しさん
2010/02/07(日) 15:58:25その(コンパイラが自動的に生成した)空のコンストラクタが呼ばれた後に
再度代入が行われて二度手間になる
0549デフォルトの名無しさん
2010/02/07(日) 15:58:43理解せずに使うやつは潜り
0550538
2010/02/07(日) 16:00:23SymbianでC++をやってた自分としてはboostは若干異世界なんだよね
0551デフォルトの名無しさん
2010/02/07(日) 16:01:39JIS X3014でもこんな気持ち悪い訳語使ってんのかな?
0552デフォルトの名無しさん
2010/02/07(日) 16:04:25そういう事情があるなら別だよ!
ただ一般論として
boostが通らない環境でない限りは
見といた方がいいんじゃね?
0553デフォルトの名無しさん
2010/02/07(日) 16:04:36どんな環境で何をどう試したの?
0554デフォルトの名無しさん
2010/02/07(日) 16:05:130555デフォルトの名無しさん
2010/02/07(日) 16:06:27文法上の意味と用語の立場からその規定が当てはめられる。
規定を定めた大元は天下りのアレが大きな役割を果たしていたので、
翻訳の仕事をした人を責めるわけにもいかないだろうに。
0556535
2010/02/07(日) 16:08:480557デフォルトの名無しさん
2010/02/07(日) 16:09:370558535
2010/02/07(日) 16:10:430559デフォルトの名無しさん
2010/02/07(日) 16:10:440560デフォルトの名無しさん
2010/02/07(日) 19:24:43>JIS X3014でもこんな気持ち悪い訳語使ってんのかな?
以前 C++ 関連記事を翻訳しようとした時に、JIS X 3014 の訳語を基準にしようかと
思ったけど、あまりにも現実との乖離が大きいので一般的なプログラマにとって
理解不能とまでは言わないけど脳内再翻訳が必要だと思って諦めた事がある。
preprocessing tokens 前処理字句
escape-sequence 逆斜線表記
function prototype 関数原型
unqualified name lookup 修飾なし名前の名前検索
initializer-list 初期化子並び
aggregates 集成体
一事が万事こんな感じで一般的な用法から訳しすぎと思われ。
0561デフォルトの名無しさん
2010/02/07(日) 19:55:42そうかなぁ。わかりやすいと思うけど。
0562デフォルトの名無しさん
2010/02/07(日) 19:57:590563デフォルトの名無しさん
2010/02/07(日) 20:07:31エスケープシーケンスはひどいけど
0564デフォルトの名無しさん
2010/02/07(日) 20:59:100565デフォルトの名無しさん
2010/02/07(日) 21:20:090566デフォルトの名無しさん
2010/02/07(日) 21:21:440567デフォルトの名無しさん
2010/02/07(日) 21:25:27staticじゃインスタンス間で共有されちゃうじゃない
0568デフォルトの名無しさん
2010/02/07(日) 22:26:51void F(const Obj& o)であってる?
0569デフォルトの名無しさん
2010/02/07(日) 22:30:48うん、それで問題ない。
0570デフォルトの名無しさん
2010/02/07(日) 22:32:570571デフォルトの名無しさん
2010/02/07(日) 22:34:51できるのとできないのがあるだろさすがに。
0572デフォルトの名無しさん
2010/02/07(日) 22:50:44って糞本でしょうか?
えぴなんちゃらのエセ本と類似品?
0573デフォルトの名無しさん
2010/02/07(日) 22:55:50C++標準化委員会のメンバーなのに絶対名前で損してるなぁ
0574デフォルトの名無しさん
2010/02/07(日) 23:12:030575デフォルトの名無しさん
2010/02/07(日) 23:35:19例外投げるのはダメなんですよね?
どうすればいいんだろう
0576デフォルトの名無しさん
2010/02/07(日) 23:37:26ダメじゃない。
思う存分なげなさい。
・・・あるいはinit関数を用意する手も。
0577デフォルトの名無しさん
2010/02/07(日) 23:44:23mhoge(0)
{
mhoge = new..
}
catch(...)
{
delete mhoge;
}
これでもリークするもんなぁ
どうすればいいんだろう困った
0578デフォルトの名無しさん
2010/02/07(日) 23:48:010579デフォルトの名無しさん
2010/02/07(日) 23:53:100580デフォルトの名無しさん
2010/02/08(月) 00:01:560581デフォルトの名無しさん
2010/02/08(月) 00:08:06mhoge = new ...; でnewに失敗
メモリ確保、hoge(?)のコンストラクタ、メモリ解放、例外送出
メモリリークする?
0582デフォルトの名無しさん
2010/02/08(月) 00:09:400583デフォルトの名無しさん
2010/02/08(月) 00:28:050584 ◆GWRSHcLrd6
2010/02/08(月) 17:52:41スマートポインタをまた改造しました。
ttp://cdtest.genin.jp/projects/smart_ptr/index.htm
バグの報告、どんな細かいことでもいいのでお願いします。
誰か実測、テスト用のコードを書いてくれませんか?
0585デフォルトの名無しさん
2010/02/08(月) 17:54:22class 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); };
全部の派生クラスに同じコード書くのはめんどいんですが
マクロ以外でこれを簡略化することはできますかね?
0586デフォルトの名無しさん
2010/02/08(月) 18:04:280587デフォルトの名無しさん
2010/02/08(月) 18:05:50基底に書いたら意味が変わっちゃう
0588デフォルトの名無しさん
2010/02/08(月) 18:07:41みたいななんか嫌なid使うのって一般的なのか?
0589デフォルトの名無しさん
2010/02/08(月) 18:08:080590デフォルトの名無しさん
2010/02/08(月) 18:09:040591デフォルトの名無しさん
2010/02/08(月) 18:09:07本気て言ってるのなら勉強し直してくれ
0592デフォルトの名無しさん
2010/02/08(月) 18:09:250593デフォルトの名無しさん
2010/02/08(月) 18:20:51基底クラスのポインタを使えば
仮想関数自体が自動的に派生クラス別に処理を分けてくれるような仕組みを提供できるのに
0594デフォルトの名無しさん
2010/02/08(月) 18:23:12何に対して言っているんだ?
0595デフォルトの名無しさん
2010/02/08(月) 18:31:50フォークとナイフがあるのに肉を手づかみしちゃうような行為。
0596デフォルトの名無しさん
2010/02/08(月) 18:33:39お久しぶりです。
スマートポインタをまた改造しました。
0597デフォルトの名無しさん
2010/02/08(月) 18:34:09RTTIのコスト避けたいとか?
0598デフォルトの名無しさん
2010/02/08(月) 18:34:58>static int x; return reinterpret_cast<int>(&x);
各クラスでsutatic宣言した変数 x のアドレスをIDとしている。
規定でやるとどれも同じ変数 x のアドレスになるので 目的を果たせない。
ということ。
0599デフォルトの名無しさん
2010/02/08(月) 18:42:06boostとどっちが優れているんだろうな。
0600デフォルトの名無しさん
2010/02/08(月) 18:43:02たとえばこんなんはどうよ
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;
0601デフォルトの名無しさん
2010/02/08(月) 18:47:35あんなキチガイ連中(褒め言葉)と比べてやるなよ
0602デフォルトの名無しさん
2010/02/08(月) 18:49:15読みづらい
0603デフォルトの名無しさん
2010/02/08(月) 18:52:56質問の仕方が悪かったのは自覚してる。反省してる
>>593
ハッシュを使って、クラスに対して任意のデータを動的に関連付けたいときとかに使えないかな?
隠蔽されたクラスを使う側のためのstaticメンバの後付けみたいな用途で
0604デフォルトの名無しさん
2010/02/08(月) 19:09:51template <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> {};
0605デフォルトの名無しさん
2010/02/08(月) 19:20:310606デフォルトの名無しさん
2010/02/08(月) 19:21:23それも考えたんですが、継承関係が深い場合には使えないんですよね
0607デフォルトの名無しさん
2010/02/08(月) 19:22:060608デフォルトの名無しさん
2010/02/08(月) 19:32:27if(p)で使えるとか
NULLポインタのつもりで0をはじくとか
循環参照を作ってみてリークするか調べるとか
自己代入してみるとか
例外を投げるクラスを入れてみるとか
0609デフォルトの名無しさん
2010/02/08(月) 19:34:020610デフォルトの名無しさん
2010/02/08(月) 19:42:10スマートポインタってそんなこともできるのか?
0611デフォルトの名無しさん
2010/02/08(月) 19:42:170612デフォルトの名無しさん
2010/02/08(月) 19:42:59試してないけど
0613デフォルトの名無しさん
2010/02/08(月) 19:46:14じゃあそのまんまだなw
0615デフォルトの名無しさん
2010/02/08(月) 21:27:06More 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的な。)
0616デフォルトの名無しさん
2010/02/08(月) 21:28:410617デフォルトの名無しさん
2010/02/08(月) 22:05:05仮想関数>visitor>>>>>>>RTTI(typeid) が一般的な解決策かなあ。
0618デフォルトの名無しさん
2010/02/08(月) 22:07:27仮想関数テーブルを最適化してくれるならvirtul使ってもいい
0619デフォルトの名無しさん
2010/02/08(月) 22:26:48#include "subc.tsv"
サブを数十作るならエクセルでコピペしちまう
0620デフォルトの名無しさん
2010/02/08(月) 22:32:11のように配列で確保する場合に
デフォルトのコンストラクタが無い場合の
new[]ってどのように記述するのが一般的なのでしょうか。
new[]のカスタムの定義の方法がよくわかりません。
それとも、コンストラクタはデフォルトのみにして
create_arrayみたいな関数でアロケートするのが
一般的ななのでしょうか。
0621デフォルトの名無しさん
2010/02/08(月) 22:33:190622デフォルトの名無しさん
2010/02/08(月) 22:38:05http://codepad.org/e9YaTqes
比較になるのか分からんけど
0623デフォルトの名無しさん
2010/02/08(月) 22:40:00boost::shared_ptrのベンチマーク
単純な生成ループ: 546
代入ループ: 515
オブジェクトのリセット: 936
オブジェクトの解放: 484
framework::smart_ptrのベンチマーク
単純な生成ループ: 452
代入ループ: 468
オブジェクトのリセット: 889
オブジェクトの解放: 453
smart_ptrの方が速い
0624デフォルトの名無しさん
2010/02/08(月) 22:43:250625デフォルトの名無しさん
2010/02/08(月) 22:43:490626デフォルトの名無しさん
2010/02/08(月) 22:44:040627デフォルトの名無しさん
2010/02/08(月) 22:44:120628デフォルトの名無しさん
2010/02/08(月) 22:44:170629デフォルトの名無しさん
2010/02/08(月) 22:44:24boost::shared_ptrのベンチマーク
単純な生成ループ: 540
代入ループ: 511
オブジェクトのリセット: 897
オブジェクトの解放: 498
framework::smart_ptrのベンチマーク
単純な生成ループ: 488
代入ループ: 477
オブジェクトのリセット: 882
オブジェクトの解放: 481
0630デフォルトの名無しさん
2010/02/08(月) 22:48:13boost::shared_ptrのベンチマーク
単純な生成ループ: 561
代入ループ: 453
オブジェクトのリセット: 858
オブジェクトの解放: 452
framework::smart_ptrのベンチマーク
単純な生成ループ: 453
代入ループ: 436
オブジェクトのリセット: 827
オブジェクトの解放: 437
0631デフォルトの名無しさん
2010/02/08(月) 22:49:410632デフォルトの名無しさん
2010/02/08(月) 22:49:470633デフォルトの名無しさん
2010/02/08(月) 22:52:130634デフォルトの名無しさん
2010/02/08(月) 22:54:57それ危険でしょ
0635630
2010/02/08(月) 22:56:32SPが抜けてた
0636デフォルトの名無しさん
2010/02/08(月) 23:15:34しかしboostでなければ上司を説得できないなど良くある話。
そもそもthread unsafeなのと比較してもねぇ。
・・・あ、Lokiは早いらしいって噂を聞いた。動けばの話だが。
0637デフォルトの名無しさん
2010/02/08(月) 23:22:410638デフォルトの名無しさん
2010/02/08(月) 23:29:23>622
0639デフォルトの名無しさん
2010/02/08(月) 23:34:19プラマイ0と考えても少し早いな
なぜ?
0640デフォルトの名無しさん
2010/02/08(月) 23:35:440641デフォルトの名無しさん
2010/02/08(月) 23:54:010642デフォルトの名無しさん
2010/02/08(月) 23:56:31単純な生成ループ: 55
代入ループ: 56
オブジェクトのリセット: 70
オブジェクトの解放: 33
framework::smart_ptrのベンチマーク
単純な生成ループ: 32
代入ループ: 32
オブジェクトのリセット: 65
オブジェクトの解放: 32
PGOもしたがBoostが勝つ結果がでない
0643デフォルトの名無しさん
2010/02/09(火) 00:00:180644デフォルトの名無しさん
2010/02/09(火) 00:02:150645デフォルトの名無しさん
2010/02/09(火) 00:17:350646デフォルトの名無しさん
2010/02/09(火) 01:26:220647デフォルトの名無しさん
2010/02/09(火) 01:29:560648デフォルトの名無しさん
2010/02/09(火) 01:34:11gcc でコンパイルできん。
> 互換性報告などもお願いします。
互換性もたせるつもりなら gcc ぐらい自分で試しといてくれよ。
0649デフォルトの名無しさん
2010/02/09(火) 01:46:000650デフォルトの名無しさん
2010/02/09(火) 03:12:22バイナリ互換性や安全性を目的としているんだから
速度がオレオレスマートポインタに負けるのは当たり前でしょ。
十分に検証されたスマートポインタはそう簡単には作れないよ。
0651デフォルトの名無しさん
2010/02/09(火) 07:15:380652デフォルトの名無しさん
2010/02/09(火) 07:18:560653デフォルトの名無しさん
2010/02/09(火) 08:40:33なんでstdcallは参照取れるのにthiscallは参照取れないんだ・・・
設計したやつ出て来て説明しる!
0654デフォルトの名無しさん
2010/02/09(火) 08:52:180655デフォルトの名無しさん
2010/02/09(火) 08:53:590656デフォルトの名無しさん
2010/02/09(火) 09:03:02T* から T*& に変換できないと言っているだけのように見えるが、
stdcall とか thiscall とか関係あるの?どんなソース書いたの?
0657デフォルトの名無しさん
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);
}
0658デフォルトの名無しさん
2010/02/09(火) 09:21:38struct TEST{
static void huga2(){
fprintf(stderr, "huga1");
}
};
0659デフォルトの名無しさん
2010/02/09(火) 09:31:17もう少しヒネって考えてみるよ
0660デフォルトの名無しさん
2010/02/09(火) 09:45:21オブジェクトを生成して
TEST obj;
hoge(&obj::huga2);
みたいにしないと
0661デフォルトの名無しさん
2010/02/09(火) 09:49:370662デフォルトの名無しさん
2010/02/09(火) 10:01:19そんなことできません。
&TEST::huga2 と obj をまとめて渡さないと。
0663デフォルトの名無しさん
2010/02/09(火) 10:01:54最初のモチベーションとして&を必ず付けるのが
見た目カッコ悪いってのがあったんだけど
&つけることにするよ
>>661
どちらかというとファンクタ的動作じゃなくて
boost::function的動作をさせたいんだ
0664デフォルトの名無しさん
2010/02/09(火) 10:23:54ファンクタ的動作と boost::function 的動作の違いがわからねー。
っていうか boost::function 使えって話じゃないの?
0665デフォルトの名無しさん
2010/02/09(火) 10:59:46これが一番速い
0666デフォルトの名無しさん
2010/02/09(火) 15:21:26クラスA内から関数Aが呼び出された場合とで、関数Aの処理を分岐させたい
のですが、何か方法はありますか?
0667デフォルトの名無しさん
2010/02/09(火) 15:22:310669デフォルトの名無しさん
2010/02/09(火) 15:30:380670デフォルトの名無しさん
2010/02/09(火) 15:31:34呼び出し側で条件を付与する
0671デフォルトの名無しさん
2010/02/09(火) 15:38:43オーバーロードが使えそうなのでこれを使うことにします
0672デフォルトの名無しさん
2010/02/09(火) 15:56:16こんなのはどう?
つーか素直にpublicとprivateで関数名を変えた方がいいよね
0673デフォルトの名無しさん
2010/02/09(火) 16:52:30ベンチにかけてみ
0674デフォルトの名無しさん
2010/02/09(火) 17:04:010675デフォルトの名無しさん
2010/02/09(火) 17:12:040676デフォルトの名無しさん
2010/02/09(火) 18:45:500677デフォルトの名無しさん
2010/02/09(火) 19:58:120678デフォルトの名無しさん
2010/02/09(火) 21:03:320679520
2010/02/09(火) 21:59:110680デフォルトの名無しさん
2010/02/09(火) 22:02:11一理ある。
0681デフォルトの名無しさん
2010/02/09(火) 22:06:53クローズドなら対象コンパイラが読めれば何でもいい。
つまり、とくに興味ありせん。
0682デフォルトの名無しさん
2010/02/09(火) 22:08:330683デフォルトの名無しさん
2010/02/09(火) 22:43:30{
public:
(Hoge)(void)
{
}
/* error
inline (Hoge)(void)
{
}
*/
inline void (Fuga)(void)
{
}
};
なぜ他はコンパイルできるのに、inline(コンストラクタ)だけエラーになるんですか?
0685デフォルトの名無しさん
2010/02/09(火) 23:01:46これでもコンパイル通らないです
コンパイラは何だ
0687デフォルトの名無しさん
2010/02/09(火) 23:07:00不具合じゃないかね
0689デフォルトの名無しさん
2010/02/09(火) 23:36:34環境:VC++2008 EE
OS:WindowsXP SP3
ウィンドウハンドル一覧を列挙する機能をWin32APIのEnumWinodowsで作っています。
普通に関数で作成する分にはできるのですが、学習も踏まえてクラス化したいと思っています。
しかし、コールバック関数をメンバ関数に含ませる方法がいまいちよくわかりません。
ググってもウィンドウプロシージャをクラス化する方法はあるのですが、
それをEnumWinodws関数に応用する方法がよくわかりません。
そのクラスの機能の最終目的は、ウィンドウ一覧の取得、ウィンドウハンドル等の情報を
vectorなどに格納、格納したハンドルを取り出す。等です。
ウィンドウ一覧を取得する部分さえできれば他の箇所は作れます。
簡単なコード、参考ページ等教示ねがいます。
コールバック関数で元の型に戻す。
0691デフォルトの名無しさん
2010/02/09(火) 23:59:51ttp://giftserver.dip.jp/anotherproject/html_l5/myroom/diary/2007/01/09.htm
ここも読んでみたが
俺にゃまだいまいちわからねぇ。
wっうぇうぇwww
0692デフォルトの名無しさん
2010/02/10(水) 00:11:21virtual継承はあまり使わないから詳しいことはわからんが
・virtual継承されてればサブクラスのどこからでも初期化できる
・複数で初期化されてれば一番下のサブクラスでの初期化が優先
ということかな
0693デフォルトの名無しさん
2010/02/10(水) 00:15:36それだと多重継承になってないから、
仮想継承の意味ないんじゃね?
0694デフォルトの名無しさん
2010/02/10(水) 00:20:23まあそうだけど、今は初期化子の話でしょ?
0695デフォルトの名無しさん
2010/02/10(水) 00:21:00でも多重継承じゃないと
初期化の問題は分かんなくない?
0696デフォルトの名無しさん
2010/02/10(水) 00:23:17仮想継承じゃないと
Sub2(void) : Base(2)
{
}
ここが通らないよ
確認にはなるでしょ
0697691
2010/02/10(水) 00:24:16ttp://codepad.org/pK2DQc8i
多重継承に直してみたよ!
感謝!
0698691
2010/02/10(水) 00:27:40こんなんでもおkなんだ。
ふーむ。
そして
ttp://codepad.org/AFW182Ps
別にSub3で明示的に呼ばなくても
勝手にBaseが呼ばれているようようだ。
・・・ああ、これが
>仮想基底のサブオブジェクトを含むオブジェクトの、最派生クラスのコンストラクタは、
>すべての仮想基底クラスの初期設定を指定しなければならない(デフォルト
>コンストラクタがある場合だけは省略してよい)。
ってやつか。
うわぁ!わかりにくいよ!!
0699692
2010/02/10(水) 00:27:41どこでも初期化できて一番下が優先ということではないみたいね
・一番下のサブクラスでBaseを初期化しないといけない
のほうがただしいね
0700デフォルトの名無しさん
2010/02/10(水) 00:28:55分からないのは慣れてないからだと思ふ。
というかこれが理解できなくて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++のエラーもまともに読めないんぢゃない?
簡単なコードを読んで理解を深めるべき。
0701デフォルトの名無しさん
2010/02/10(水) 00:29:02ttp://codepad.org/AFW182Ps
で、デフォルトコンストラクタをコメントアウトすると
基本クラス 'Base' を初期化するデフォルトコン
ストラクタが見つからない(関数 Sub3::Sub3() )
っていうコンパイルエラーになる。
0702691
2010/02/10(水) 00:33:39分かりやすい丁寧な解説をどうもありがとう!
> test(int n) : base(n), a(n){ std::cout << "test ctor" << std::endl; }
は分かっていたつもりだったんだが
> 初期設定を指定
っていうところで意味不明になった。
> 初期設定を指定ってつまりは
初期化子リストの意味だったのね。。
0703デフォルトの名無しさん
2010/02/10(水) 00:34:00明示的にコンストラクタを1つでも記述した場合、デフォルトコンストラクタは作成されません。
0704デフォルトの名無しさん
2010/02/10(水) 00:36:18thisを使う方法は思いつきませんでした。
コールバック関数はstaticにして、
EnumWindows関数では第一引数のコールバック関数をWNDENUMPROCにキャスト、
第二引数にはthisをキャストすることでやりたいことを実現できました。
助かりましたです
0705デフォルトの名無しさん
2010/02/10(水) 00:38:41ああごめん、俺は単に横から>>691への口出し。
俺は別に知っているから大丈夫だお。
0706デフォルトの名無しさん
2010/02/10(水) 01:31:38どのコードがいくつメモリ食ってるが総和を計算してくれるツールありますか。
0707デフォルトの名無しさん
2010/02/10(水) 01:35:58operation systemっていうのを使うといいらしいですよ
0708706
2010/02/10(水) 02:10:16linuxは動かないんです
こんなのみつけたけど
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/
0709デフォルトの名無しさん
2010/02/10(水) 02:10:510710デフォルトの名無しさん
2010/02/10(水) 02:23:58どこかを特定したいんです
0711デフォルトの名無しさん
2010/02/10(水) 03:00:590712デフォルトの名無しさん
2010/02/10(水) 13:45:020713デフォルトの名無しさん
2010/02/10(水) 13:51:55例えば
boost.thread.lib
boost.shared_ptr.lib
と機能ごとにするのか
boost.lib
と全部まとめた方がいいのか
どういうふうにするのが一般的なんでしょうか?
0714デフォルトの名無しさん
2010/02/10(水) 14:04:09分かれてても指定するのが面倒臭いだけでリンク時間が少し短縮するかどうかわからんくらいのメリットしかないし
0715デフォルトの名無しさん
2010/02/10(水) 14:09:12ひとつにまとめてコンパイルすることにします
0716デフォルトの名無しさん
2010/02/10(水) 14:12:24メモリリークはしてないんです
0717デフォルトの名無しさん
2010/02/10(水) 14:16:36自分でモニタするシステムを作ればいいんじゃないかなということを言いたかった
0718デフォルトの名無しさん
2010/02/10(水) 14:34:41そのときにstaticメンバを使いたい場合は下の方法は両方共安全ですか?
http://codepad.org/ufCFZ8dx
どのような時にはいた制御をおこなえばいいんですか?
削除の時ぐらいですか?
インクリメントとデクリメントの時はどうなんでしょうか?
0721 ◆GWRSHcLrd6
2010/02/10(水) 17:30:36_Interlocked系とかですかね?(確かこれは組み込みですよね・・・?)
0722デフォルトの名無しさん
2010/02/10(水) 17:38:24あなたが実装したスマートポインタが持つ
全てのパブリックメソッドをロックしないとまずいのでは
ロックするには
cpp0xなら標準で
それ以前なら
windowsだけならCriticalSection
UnixLinuxWindowsならPOSIXのpthreadのmutex
0723デフォルトの名無しさん
2010/02/10(水) 17:39:24ベンチして報告してくれるとうれしい
0724デフォルトの名無しさん
2010/02/10(水) 17:44:26そうすれば比較的簡単に差し替えられるんじゃないかなぁ
速度が気になるな
でもptr_inner::object, ptr_inner::count は変更しなければロックの必要なし?
0725デフォルトの名無しさん
2010/02/10(水) 17:47:33Interlocked自力 < criticalsection < mutex
みたいだな
mutexが一番遅いみたいだが移植性を考えるとmutex使いたくなるが
0726デフォルトの名無しさん
2010/02/10(水) 17:49:380728デフォルトの名無しさん
2010/02/10(水) 17:56:24同一スレッドからのロックなら素通りさせたり
なんてことしてたらどんどん重くなるけど
軽くしたいならスリープじゃね?
0729デフォルトの名無しさん
2010/02/10(水) 18:56:59他に何かロックしたいものがあるなら別だが
弱参照とか考え出すと面倒そうだ
0730デフォルトの名無しさん
2010/02/10(水) 20:19:100731デフォルトの名無しさん
2010/02/10(水) 20:20:470733デフォルトの名無しさん
2010/02/10(水) 20:47:203番目のデフォルト引数
0734デフォルトの名無しさん
2010/02/10(水) 20:51:40class list;
2番目じゃね?
0735 ◆GWRSHcLrd6
2010/02/10(水) 20:58:57修正してうpしました。
>>622さんのをちょいと拝借してテストモジュールを書いてみました。
インターロック実装はまだです。
>>730
custom deleterは関数オブジェクトを渡せるはずです。さらにカスタムなら
ptr_innerを改造するとか。なんか取り違えていたらごめんなさい m(_ _)m
>>731
custom allocatorってどういうのなんですか?
よく知らなくて orz
HowじゃなくてWhyだぜ
0737デフォルトの名無しさん
2010/02/10(水) 21:06:44まず<memory>ヘッダを熟読する事
boost::poolなどを入れて実験すると良い
0739デフォルトの名無しさん
2010/02/10(水) 21:14:45何考えてるんだ。
0740デフォルトの名無しさん
2010/02/10(水) 21:15:19std::construct()
std::destruct()
などは普通に使用してると思うが
0741デフォルトの名無しさん
2010/02/10(水) 21:17:10ずっと使用されないものだと思ってたわ。
長年の疑問が解けた。
ありがとう
0743デフォルトの名無しさん
2010/02/10(水) 21:22:18計算中...
単純な生成ループ: 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%
0744デフォルトの名無しさん
2010/02/10(水) 21:26:40実験してみたが、そう速くはならなかった
標準のアロケータで十分にチューニングされているようだ
0745デフォルトの名無しさん
2010/02/10(水) 21:28:280746デフォルトの名無しさん
2010/02/10(水) 21:30:35型名だけ書いて変数名省略しようぜ
0747デフォルトの名無しさん
2010/02/10(水) 21:32:47>もし、パフォーマンスを真剣に考えているなら、std::list のようなコンテナを
>扱うときは fast_pool_allocator を、std::vector のようなコンテナを扱うときは
>pool_allocator を使うとよい。
うーむなかなか奥が深いな
0748デフォルトの名無しさん
2010/02/10(水) 21:35:40連続領域かそうでないかで場合分けしてるだけ。
ここには、std::listがアロケータをほとんど使わないと書いてあるんだが間違い?
0750デフォルトの名無しさん
2010/02/10(水) 21:38:41不要なnullチェックを省いたのか
意外と速くなるもんだな
0751デフォルトの名無しさん
2010/02/10(水) 21:38:56お薬出しておきますね
つ タミフル
0752デフォルトの名無しさん
2010/02/10(水) 21:40:360753デフォルトの名無しさん
2010/02/10(水) 21:41:00vectorでは再度アロケートし直すからそれと比べて
listは要素をアロケートし直す動作を隠蔽する必要がないって言ってるんじゃない?
そもそも、「殆ど使わない」は「全く使わない」ではないからある程度使うし、vectorの使用回数が異常なだけ。
0754デフォルトの名無しさん
2010/02/10(水) 21:42:020755デフォルトの名無しさん
2010/02/10(水) 21:43:55そんな事は単純に言えないのでわ?
複雑な部分はユーザーから見えない部分に隔離して
表面的には簡単に見えるように努力していると思う
ただしストリームの多重継承とかマニピュレータとか
std::stringのメンバ関数の多さとか、問題があるなあ
と思える部分があるのは仕方が無い
0756デフォルトの名無しさん
2010/02/10(水) 21:50:10これこそちょっとC++齧って俺TSUEEEEしてるスクリプトキディが言いそうな事に思えるけど。
肥大化とか仕様が膨大とか言ってるけど
言語の計算機科学的側面から性質やコンパイル時の効率と整合性、
実行速度と記述の方法を照らし合わせて最もベターな方法を取った部分など
基本形が分かっていれば仕様なんて参照しなくても容易に予測できて
理にも適ってるところが多いと思うけど。
あんまり適当な事ばかり言ってスレを荒らさない方が良いよ。
こんな議論もう10年以上前に決着が付いてるんだし。
0757デフォルトの名無しさん
2010/02/10(水) 21:51:17あれを読むとぐぅの音も出なくなる
0758デフォルトの名無しさん
2010/02/10(水) 21:53:08なんか>>756さんがすげぇ書いてくれているけど、
初心者が嫌うというより、バカには使えない言語になっている
だけだと思うんだけど。
0760デフォルトの名無しさん
2010/02/10(水) 21:53:520761デフォルトの名無しさん
2010/02/10(水) 21:54:25listでもなんでも指定したアロケータが使われる。
そのためにrebindがあって、list<T>ではallocator<T>が使われるという保証はないけど、
別の型Uに対するallocator<U>という形で、指定したアロケータが使われることに変わりはない。
0762デフォルトの名無しさん
2010/02/10(水) 21:56:00「読めない」「長すぎ」「typenameって何だよ気持ち悪い」
「BOOST_PP_〜ってなに?」「ポインタと参照の区別が付かない」
とか言ってる碌に動作を調べもしない馬鹿ばっかりだからな。
本当にD&Eくらい読めと言いたくなる。
0764デフォルトの名無しさん
2010/02/10(水) 21:59:04バカには使えない言語になっているってのは
ある意味いいことでもある。
0765デフォルトの名無しさん
2010/02/10(水) 22:00:090xじゃなくて現行仕様の話をしてるんだよ。
0766758
2010/02/10(水) 22:00:32> 「typenameって何だよ気持ち悪い」
ちょっと同意ww
> 「BOOST_PP_〜ってなに?」
これはともかく
> 「ポインタと参照の区別が付かない」
こんなやつ居るの!?
C++とかいう問題じゃなくて、他の言語も出来ないだろそれじゃ。
0767デフォルトの名無しさん
2010/02/10(水) 22:01:480768デフォルトの名無しさん
2010/02/10(水) 22:03:05> 実際C++をdisってるのって
こんな書き方をするのって柄の悪い若者ばかりだよね。
頭の悪いというよりは、頭も悪くて自己防衛と称して他者に考え方を押し付ける人間だと思う。
これじゃ体育会系が根性論振り回してるだけ。
0769デフォルトの名無しさん
2010/02/10(水) 22:03:30Boost
Loki
Qt他
じゃ不満?
外部のライブラリはC言語用かC++言語用が多くね?
0770デフォルトの名無しさん
2010/02/10(水) 22:04:15それはCも同じじゃないか?
まだSTLがある事を喜べよ
ポトペタが好きならC#かC++Builder使えばいいし
0772デフォルトの名無しさん
2010/02/10(水) 22:04:49C++が好きだろうが嫌いだろうが関係ない。
スレタイに沿わない話は全て止めろ!
0773デフォルトの名無しさん
2010/02/10(水) 22:04:520774デフォルトの名無しさん
2010/02/10(水) 22:08:13中身を見ないで外見だけで判断する老害
0775デフォルトの名無しさん
2010/02/10(水) 22:09:480776デフォルトの名無しさん
2010/02/10(水) 22:10:030777デフォルトの名無しさん
2010/02/10(水) 22:10:490778デフォルトの名無しさん
2010/02/10(水) 22:12:100779デフォルトの名無しさん
2010/02/10(水) 22:30:30面白いな
SM PlayerがQtで作られているのを知って驚いた
0780デフォルトの名無しさん
2010/02/10(水) 22:37:370781デフォルトの名無しさん
2010/02/10(水) 22:43:55mocについて調べてみたけどプラットフォームを共通化するために
随分と苦労しているような印象を受ける
事実上のMotifの後継規格っぽいな
この辺はC++Builderの方がシンプルか
その代わり他の開発環境では動かないけど
0782デフォルトの名無しさん
2010/02/10(水) 22:53:36いったいどうやってんだか。。。
0783デフォルトの名無しさん
2010/02/10(水) 22:55:52プラットフォーム事に違う物(かつ最適な物)を吐くようになってるんだろうな
0784デフォルトの名無しさん
2010/02/10(水) 22:59:02だっけ?
最後はこのslotsとかは削除されてコンパイラに渡されるんだよね。
>>780
しかしQxxxというクラスに依存してQtを使っていれば
どうせ環境依存・・・じゃなくてQt依存になるわけだからいいのでは?
0785デフォルトの名無しさん
2010/02/10(水) 23:16:38お!なかなかいいスコアーが出てますな。
*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%
0786デフォルトの名無しさん
2010/02/10(水) 23:17:42C++の機能が足りない証拠
C++はもっと機能を増やすべきだ
0787デフォルトの名無しさん
2010/02/10(水) 23:19:260788デフォルトの名無しさん
2010/02/10(水) 23:20:190789デフォルトの名無しさん
2010/02/10(水) 23:22:49inlineとかthisとか書かなくてもいい部分は省略したほうが読みやすくないかな?
0790デフォルトの名無しさん
2010/02/10(水) 23:23:43要するにVCLはそのまま使い、言語の方を変える事によって手抜きしたわけだ
VCLがC++で書いてあったらと何回思ったか分からない
0791デフォルトの名無しさん
2010/02/10(水) 23:32:33サポートするために必要な予約語だ
メタコンパイラが嫌ならC++/Qtみたいな言語を作ればいいだろうが
恐らく歓迎はされないだろうな
0792デフォルトの名無しさん
2010/02/10(水) 23:34:040793デフォルトの名無しさん
2010/02/10(水) 23:34:370794デフォルトの名無しさん
2010/02/10(水) 23:35:44> mocが無ければQt使ってたんだけどなあ・・・せっかくLGPLになったのに勿体無い
だからQxxxというクラスに依存してQtを使っていれば
どうせ環境依存・・・じゃなくてQt依存になるわけだからいいのでは?
0795デフォルトの名無しさん
2010/02/10(水) 23:47:210796デフォルトの名無しさん
2010/02/10(水) 23:48:34いやmocは別に環境依存を解消しているわけじゃ
ないんだぞ?
している面もあるのかもしれんけど、
mocって何の略だか考えて見れば。。。
0797デフォルトの名無しさん
2010/02/11(木) 00:41:24何がオーバーヘッドなんだろうなぁ
Free()の呼び出しとか?
0798デフォルトの名無しさん
2010/02/11(木) 00:52:38Decでcount==0は冗長じゃないかな?
0799デフォルトの名無しさん
2010/02/11(木) 00:54:22ptr_innerにはメモリプールを使うことも考えたのですが・・・
管理が大変なんですよね
0801 ◆GWRSHcLrd6
2010/02/11(木) 11:26:28すいません
>>797
0802デフォルトの名無しさん
2010/02/11(木) 11:51:01・考えるのが面倒
どれ?
0804デフォルトの名無しさん
2010/02/11(木) 11:59:11評価してなくて早くなる気がしてるのに実装しないなら後者だよね
とか言われそうだけど仕事じゃないんだからゆっくりやればいいよ
0805デフォルトの名無しさん
2010/02/11(木) 12:03:01言い換えるならばメモリ管理のそのコストが必要な実装において最小なら
その実装は必要
領域管理が大変なコストになりそうで。
どの領域が使用されているのか、そのチェックが大きなオーバーヘッドに
なる気がするんですよね。
コストを減らそうと一度に多くとる・・・ってだけじゃ
コンスタントにメモリを喰うわけですし。
0808デフォルトの名無しさん
2010/02/11(木) 13:40:500810デフォルトの名無しさん
2010/02/11(木) 13:57:56説明してくれ
0811デフォルトの名無しさん
2010/02/11(木) 13:58:410812デフォルトの名無しさん
2010/02/11(木) 14:02:32マルチスレッドではロックは常にいる
0813デフォルトの名無しさん
2010/02/11(木) 14:07:52必要とは言い切れんよ
0814デフォルトの名無しさん
2010/02/11(木) 14:09:39アトミック性の保証と言った方がいいか
intやポインタ1個だからって中間状態がないとは言い切れないからな
0815デフォルトの名無しさん
2010/02/11(木) 14:18:25格納するポインタの動作をスレッドセーフにしたいの?
前者ならget時には要らない
0816デフォルトの名無しさん
2010/02/11(木) 14:20:39どこへのセット?
スマポが参照するオブジェクトをスレッド間で共有するのが目的で、スマポそのものを共有する訳ではないから一つのスマポそのものへの同時アクセス保護は不要でしょう。
内部カウンタについてもカウンタは共有されるからアトミック操作は必要だけど、ほかのメンバーは初期化後に変更されないでしょうし。
0817デフォルトの名無しさん
2010/02/11(木) 14:24:400818デフォルトの名無しさん
2010/02/11(木) 14:50:03tolowerで1文字ずつ変換しつつ比較するしか
ないですよね?
一度にわさっと比較する方法ないですよね?
0819デフォルトの名無しさん
2010/02/11(木) 14:53:150820デフォルトの名無しさん
2010/02/11(木) 14:54:274文字分の変換テーブル
0821デフォルトの名無しさん
2010/02/11(木) 14:54:33ベクタな減算とか'A'へのベクタな加算とかいろいろしてわさっとできる。
0822デフォルトの名無しさん
2010/02/11(木) 14:58:22string word;
//
//gcc(VCならtoupperの型が違うので関数オブジェクトを作る)
transform(word.begin(),word.end(),word.begin(),toupper);
//で変換して
if(word < word2)
0823デフォルトの名無しさん
2010/02/11(木) 15:04:12stringなんて作ったらそれだけで遅い
意味ないこと書かないでくれよ
0824デフォルトの名無しさん
2010/02/11(木) 15:07:29これはGC_mallocで確保した物を自動開放するやつだが
スマートポインタと機能は同じだろ。
歴史が長く使いこなされてるから、これよりパフォーマンス上がらないとこっち使えばいい。
0825デフォルトの名無しさん
2010/02/11(木) 15:08:000826デフォルトの名無しさん
2010/02/11(木) 15:10:23などと定義すれば、すべての動的確保を自動化できる。
全自動したとき、Boehm GCより速度が上がるなら使う。
0827デフォルトの名無しさん
2010/02/11(木) 15:14:30組み込んで、ピークメモリと実行速度を比較してくれよ。
0828デフォルトの名無しさん
2010/02/11(木) 15:20:48スマートポインタはカスタムデリータが指定できるから大丈夫だそうだが
カスタムデリータを指定せずにスマポを使ったら
メモリが破棄されなかったりする?
0829デフォルトの名無しさん
2010/02/11(木) 15:21:20バイナリモードだったら動的配列にreadすればいいんですが
テキストモードだとreadが使えないので困ってます
0830デフォルトの名無しさん
2010/02/11(木) 15:32:120831デフォルトの名無しさん
2010/02/11(木) 15:39:380832デフォルトの名無しさん
2010/02/11(木) 15:43:03効率のいい方法より、確実に動かすことを考えたら
0833デフォルトの名無しさん
2010/02/11(木) 15:43:48The 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関数あたりは、通常は許容されませんコール。
0834デフォルトの名無しさん
2010/02/11(木) 15:43:55書いてみたけど
テキストモードという前提があるから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;
}
0835デフォルトの名無しさん
2010/02/11(木) 15:44:12レジスタ1つに入るレベルだから中間状態はないだろう
0836デフォルトの名無しさん
2010/02/11(木) 15:46:55破壊されない。
newした側でshared_ptrに渡せばnewした側のランタイムのデリータが呼ばれる。
0837デフォルトの名無しさん
2010/02/11(木) 15:53:16君は、Boehm GC使ってるの?
0838デフォルトの名無しさん
2010/02/11(木) 15:57:04boost使うくらいなら、こっちを使う。
boostの頻繁な更新とスマートポインタの変化をチェックするのは面倒。
あと重いし、スマートポインタだけ分離できない。手を加えればいけると思うけど面倒。
0839デフォルトの名無しさん
2010/02/11(木) 16:04:28win32_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).
0841デフォルトの名無しさん
2010/02/11(木) 16:50:38STLとの相性はどう?
>>831
速いのか遅いのかよく分りません
#defineしか無いのでしょうか?
0843デフォルトの名無しさん
2010/02/11(木) 17:04:17スマポにsleepはいらないと思うよ。
スマポはアトミックオペレーションで実装できると思うよ。
0844デフォルトの名無しさん
2010/02/11(木) 17:13:40調べる簡単な方法はありますか?
char[100] str;
sprintf(str, "%e", a);
としてdouble aの値を書いておいて、先頭が'-'かどうかを調べるのは思いついたのですが、
通常はどうやるんでしょうか。
0845デフォルトの名無しさん
2010/02/11(木) 17:17:520846デフォルトの名無しさん
2010/02/11(木) 17:20:180847デフォルトの名無しさん
2010/02/11(木) 17:27:36CPU依存するみたいだけど
これが出来ないような環境はマルチスレッド推奨じゃないと思っていいんじゃないかな
0848デフォルトの名無しさん
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 */の部分はコメントでないことにとなります。
0849デフォルトの名無しさん
2010/02/11(木) 17:37:39C++言語では "" で挟まれた物を文字列として扱います。
"コメントでない"//comment
5. コメントと文字列の入れ子について
C++言語では3.と同様に、最初に出現したものを優先します。
#############C++言語 コメント&文字列の扱いの例#############
// comment /*
foo コメントでない
// comment */
foo /*
comment
// comment */
// comment /*
foo コメントでない
foo */ これはコメントでない
"// foo" コメントでない
// "comment" コメントである
/* "comment" コメントである
comment
// comment */
foo コメントでない
"/*" コメントでない
foo コメントでない
// comment */
0850デフォルトの名無しさん
2010/02/11(木) 17:39:03ttp://codepad.org/PMJ0Om1O
こっちのがずっと見やすいな。
アトミックオペレーションを保証するためのlock関数みたいのはあるんでしょうか?
インクリメントだけでなく、内部ポインタに入る前に他のスマートポインタからの操作を
ロックしたいのですが。
void AddRef()
{
lock();
inner->Increment();
// 前後にロックしていなかったらIncrementに入った直後に
// 無くなっているかもしれない(推論)
unlock();
}
勘違いですかね?
int is_cpp()
{
return 1 //**/ 2
;
}
0853デフォルトの名無しさん
2010/02/11(木) 17:46:06スマポの複製をするときは、そのスレッドは最低1個のスマポを掴んでいるから開放されることは無いと思うよ。
0854デフォルトの名無しさん
2010/02/11(木) 17:57:35smart_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();
}
0855デフォルトの名無しさん
2010/02/11(木) 18:01:56ケース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-?--------------------------
こうなる
0856デフォルトの名無しさん
2010/02/11(木) 18:02:49http://qqqppp.net23.net/BoehmGCwin32.zip
バリナリ上げとく。
全てのメモリ管理を置き換えるわけではなく
STLだけ標準にも出来る。
GC_mallocを使ったときだけ、ガベージコレクション発動する。
0857デフォルトの名無しさん
2010/02/11(木) 18:20:29昔これを書いてる奴がいて、よっぽど M か
トンチ好きなんだなと思った記憶がある。
0858デフォルトの名無しさん
2010/02/11(木) 18:22:210859デフォルトの名無しさん
2010/02/11(木) 18:45:43せっかく複数のスマポ間でオブジェクトの共有をできるようにしてるのに、スマポ本体をスレッド間で共有する必要はなくないか。
スレッドごとにスマポを作った上で一つのオブジェクトをスマポで共有すればいいんでしょう。
0860デフォルトの名無しさん
2010/02/11(木) 19:07:08もうここまでくるとスレッドセーフに設計する必要ない気がする
エラーになるケースが思いつかん
みんなの意見をオラにくれ
0861デフォルトの名無しさん
2010/02/11(木) 19:32:25共有するならスレッドセーフにしないと共有されてるカウンタのInc/Decができないから必要だわ。
0862デフォルトの名無しさん
2010/02/11(木) 19:34:30という文字列を配列に格納したい場合の質問です
int a,b,c;
char d[10];
sscanf_s(buf,"%d,%s,%d,%d,",%a, %d, sizeof(d), &b, &c);
と書いているんですがdにうまく「あいうえお」と収納できません。
どこが間違っていますか?
dに「あいうえお,1,2,」と収納されてしまいます
0863862
2010/02/11(木) 19:36:01sscanf_s(buf,"%d,%s,%d,%d,",%a, d, sizeof(d), &b, &c);
の間違いでした。
この状態だと動きませんので教えてください。
0864デフォルトの名無しさん
2010/02/11(木) 19:36:27共有リソースをアクセスするときには排他処理を入れると思う
0865デフォルトの名無しさん
2010/02/11(木) 19:39:28まだ間違ってね?
0867デフォルトの名無しさん
2010/02/11(木) 19:53:18ポインタaをshared_ptrなどに格納した後このshared_ptrには触れず、
処理は生のポインタaを介して行う…というのは行うべきではありませんか?
0868デフォルトの名無しさん
2010/02/11(木) 19:58:37インタフェースの関係で仕方ない場合はあるが
基本的にはやるべきじゃない
何のためにshared_ptrを使ってるのかって話になる
0869デフォルトの名無しさん
2010/02/11(木) 20:04:20スマートポインタは直ちに回収するんだろ。
GCは1秒や5秒ごとでもいいはず。
0870デフォルトの名無しさん
2010/02/11(木) 20:05:28ありがとうございました。
クラスのメンバをスマートポインタ型などで宣言するのに抵抗があるもので…
0871デフォルトの名無しさん
2010/02/11(木) 20:08:30> クラスのメンバをスマートポインタ型などで宣言するのに抵抗があるもので…
( ゚д゚)
(つд⊂)ゴシゴシ
(;゚д゚)
(つд⊂)ゴシゴシ
(゚Д゚≡゚д゚)エッ!?
基礎中の基礎だぞ?
0872デフォルトの名無しさん
2010/02/11(木) 20:11:40クラスメンバのポインタとか裸んぼさん
0873デフォルトの名無しさん
2010/02/11(木) 20:11:59マーク・アンド・スイープ - Wikipedia
この方式は、参照カウントにおける問題を回避し、
不要なオブジェクトを確実に破棄できる。
また、参照カウントを使わない分、
ガベージコレクタが動作していない間の処理は高速である。
反面、ガベージコレクタ自体は、参照カウント方式より処理時間がかかるため、
参照カウントによるごみ集めと併用されることがある。
いくつかのシステムでは、参照カウントによるごみ集めを常に行い、
マークアンドスイープは、次のような適当なタイミングを見計らって時々行う。
メモリが不足してきたとき
システムが何もしていないとき
プログラムから明示的な指令があったとき
0874デフォルトの名無しさん
2010/02/11(木) 20:13:51その書き方だとしちゃいけないみたいに読めるぞw
0875デフォルトの名無しさん
2010/02/11(木) 20:16:09これは初心者にありがち
0876デフォルトの名無しさん
2010/02/11(木) 20:19:13これは不便。デストラクタをもつクラスにはつかえんな。
Python - Wikipedia
マーク・アンド・スイープ方式のみに頼っている言語では、
オブジェクトがいつ回収されるか保証されないので、
ファイルのクローズなどをデストラクタに任せることができない。
CPythonは参照カウント方式を併用することで、循環参照が発生しない限り、
オブジェクトはスコープアウトした時点で必ずデストラクトされることを保証している。
JythonおよびIronPythonではマーク・アンド・スイープ方式を採用しているため
スコープアウトした時点で必ずデストラクトされることが前提のコードだと
JythonやIronPythonでは正しく動かない。
0877デフォルトの名無しさん
2010/02/11(木) 20:22:30>JythonやIronPythonでは正しく動かない。
自分のプログラムに関係ないところで悩まされるのは嫌だなあ・・
0878デフォルトの名無しさん
2010/02/11(木) 20:22:41参照消滅と同時だと、頻繁に回収が起こりパフォーマンスが落ちるし。
0879デフォルトの名無しさん
2010/02/11(木) 20:24:490880デフォルトの名無しさん
2010/02/11(木) 20:27:12クラスは自動変数か明示的な動的確保して
クラス内でガベージコレクション使って動的確保したら、デストラクタは動作する。
なのでたいした問題ではない。
0881デフォルトの名無しさん
2010/02/11(木) 20:54:51>共有するならスレッドセーフにしないと共有されてるカウンタのInc/Decができないから必要だわ。
なぜ?
0882デフォルトの名無しさん
2010/02/11(木) 21:12:40いつデストラクトされるか分らないなんて、確かに困るよな。
大量のバッチ処理時なんかに、ファイルのオブジェクトがいつまでも残ってクローズされて共有違反になるとか非常に困る。
0883デフォルトの名無しさん
2010/02/11(木) 21:22:42という文字列を配列に格納したい場合の質問です
int a,b,c;
char d[10];
sscanf_s(buf,"%d,%s,%d,%d,", %a, d, sizeof(d), &b, &c);
と書いているんですがdにうまく「あいうえお」と収納できません。
どこが間違っていますか?
dに「あいうえお,1,2,」と収納されてしまいます
0884デフォルトの名無しさん
2010/02/11(木) 21:29:480885デフォルトの名無しさん
2010/02/11(木) 21:33:33%a というのは正しいのですか?
0887デフォルトの名無しさん
2010/02/11(木) 21:40:47確かに必要な気がしなくなってきた
0888デフォルトの名無しさん
2010/02/11(木) 21:43:060890883
2010/02/11(木) 22:01:491〜4文字だった場合は失敗するのでそういう方法以外でお願いします
0891デフォルトの名無しさん
2010/02/11(木) 22:05:51sscanf_s(buf,"%d %s %d %d ", %a, d, &b, &c);
0892デフォルトの名無しさん
2010/02/11(木) 22:25:110893883
2010/02/11(木) 22:31:05多分「,」ではなくスペースで区切って処理をしろって事ですよね
892のソースはそのまま動きましたありがとうございます
0894デフォルトの名無しさん
2010/02/11(木) 22:39:03代入
boost: 120
framework: 55
速すぎクソワロタww
0895デフォルトの名無しさん
2010/02/11(木) 23:34:48sscanf()、そして C 言語はそういうもの。文字列のサイズをきっちり管理したいのであれば別の方法をとるべき。
0896デフォルトの名無しさん
2010/02/12(金) 00:17:34そういうことを聞いてるんじゃないから
0897デフォルトの名無しさん
2010/02/12(金) 00:35:54struct 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が入っている?
それともコンパイラ依存になってしまうからやるべきでない?
0898デフォルトの名無しさん
2010/02/12(金) 00:42:59sscanf() で日本語つーか2バイト文字入るのか。
wchar_t じゃなくて char で。 %s で。
swscanf() とか使わなくていいの?
0899デフォルトの名無しさん
2010/02/12(金) 00:52:41>>883だと、終端文字が入るから実質11バイト必要でバッファオーバーフローしてるよな?
0900デフォルトの名無しさん
2010/02/12(金) 01:02:07いやいや、sscanf() の引数に sizeof( ) をわたしているから、>>883 はなにか勘違いしているような気が。
0901デフォルトの名無しさん
2010/02/12(金) 02:38:450902デフォルトの名無しさん
2010/02/12(金) 07:35:24そういうVC独自の関数なんだよ。
0903デフォルトの名無しさん
2010/02/12(金) 07:40:54こっち行け
【初心者歓迎】C/C++室 Ver.71【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1264774545/
0904デフォルトの名無しさん
2010/02/12(金) 09:04:500905デフォルトの名無しさん
2010/02/12(金) 12:18:55VisualC++2008EE
boost 1.34
使える機能は動的削除子くらい。
でも、削除子やカウンターのメモリ確保に自前のメモリプール使ってるからこのベンチは
実質ほとんどメモリ確保をしないで済んでいる。うちの子が得意なベンチでした。
boost::shared_ptrのベンチマーク
単純な生成ループ: 318
代入ループ: 226
オブジェクトのリセット: 424
オブジェクトの解放: 225
Voiful::obj_ptrのベンチマーク
単純な生成ループ: 70
代入ループ: 69
オブジェクトのリセット: 179
オブジェクトの解放: 73
0906デフォルトの名無しさん
2010/02/12(金) 12:29:120907デフォルトの名無しさん
2010/02/12(金) 12:52:080908デフォルトの名無しさん
2010/02/12(金) 13:06:46リセット機能すらない20行スマポでもその倍ぐらい遅いわ
0909デフォルトの名無しさん
2010/02/12(金) 13:09:130910デフォルトの名無しさん
2010/02/12(金) 13:26:37Googleのメモリ管理使うと標準と大差付くのだが、
メモリがボトルネックになることが少ない。
メモリを頻繁に生成する実用アプリに組み込んで比較しないと性能でない。
0911デフォルトの名無しさん
2010/02/12(金) 13:38:34こーゆーモノ作る時には有難い方法だね。
0912デフォルトの名無しさん
2010/02/12(金) 14:11:07実装は基本避けるからなー。
0913デフォルトの名無しさん
2010/02/12(金) 14:25:05いいし速度より安全で確実で使いやすいことが大事だろう。
全てGCで管理するなら速度も大事だけど。
0914デフォルトの名無しさん
2010/02/12(金) 16:33:220915 ◆GWRSHcLrd6
2010/02/12(金) 16:52:14メモリプールでそんなに速くなるんですね・・・
勉強になります。
0916デフォルトの名無しさん
2010/02/12(金) 17:35:47一縷の望みをかけて試してみるものの、残念な結果に終わるんだぜ。
0917デフォルトの名無しさん
2010/02/12(金) 17:47:350918デフォルトの名無しさん
2010/02/12(金) 18:23:080919デフォルトの名無しさん
2010/02/12(金) 18:26:30ファイルからロードする部分と、メモリブロックにアクセスする部分が
並列に動作すればいいと思うんですが。
前方にロックかかっていたら待って終わったら作業。
0920デフォルトの名無しさん
2010/02/12(金) 18:35:46並列化無しの単純なシーケンシャルリードに速度に劣るんです。
winAPIのcreateファイルでバッファ有りにすると、でかいファイルほど
バッファリングにバグらしくって速度が落ちるんです。
そこでwinapiのバッファ無しで自前で管理したいんです。
処理速度とロード速度が一致していれば、ファイル読み込みがメモリアクセスと同時間で出来ると思うのですが。
0921デフォルトの名無しさん
2010/02/12(金) 18:38:030922デフォルトの名無しさん
2010/02/12(金) 18:44:37バッファは付いてても先読みはほとんど無いと思うんですが。
多めに読んどくのはあるだろうけど
0923デフォルトの名無しさん
2010/02/12(金) 18:52:580924デフォルトの名無しさん
2010/02/12(金) 18:57:1920Mのブロックの処理時間が500ms、ロード時間が500msなら
200Mのファイルの処理時間は、10秒になります。
処理とロードが並列動作すれば5秒で出来ます。
0925デフォルトの名無しさん
2010/02/12(金) 18:59:59普通に非同期で読むのじゃだめなの?
0926デフォルトの名無しさん
2010/02/12(金) 19:07:06自前でキャッシュ管理したいっていうようなものです。
バッファの空きがあれば読めるだけ読んどく部分と
順アクセスする部分がいるんです。
非同期、マルチスレッドで読み込むんですが、そのキャッシュろロック管理が手間なので
先読みライブラリはない物かと聞きに来ました。
0927デフォルトの名無しさん
2010/02/12(金) 19:22:050928デフォルトの名無しさん
2010/02/12(金) 19:23:27最近のパソコンはメモリ多いのでメモリに上げてしまってメモリーストリームのような
仕組みでも考えればいいんだけどそういうのじゃあないんでしょ?
0929デフォルトの名無しさん
2010/02/12(金) 19:39:04順アクセスのみで高速化したいです。
0930デフォルトの名無しさん
2010/02/12(金) 23:26:450931デフォルトの名無しさん
2010/02/12(金) 23:34:05しかしそんなAPIあったっけ?
0932デフォルトの名無しさん
2010/02/13(土) 00:12:110933デフォルトの名無しさん
2010/02/13(土) 00:12:36うん
0934デフォルトの名無しさん
2010/02/13(土) 00:19:160935デフォルトの名無しさん
2010/02/13(土) 00:25:58>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
0936デフォルトの名無しさん
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
0937デフォルトの名無しさん
2010/02/13(土) 00:55:47巨大ファル読み込むと、異常にロードが低下するよ。
3ギガのファイルの先頭100M読み込むだけで大分かかる。2度目はキャッシュ効くけど。
0938デフォルトの名無しさん
2010/02/13(土) 00:56:40バッファリングとか考える必要はないんだよな
むしろHDD上でヘッドの移動がほとんど起きないように配置しとけってレベルで
バッファリングが効くのはバッファ内に収まる小さい物とかそんなんだろうな
0939デフォルトの名無しさん
2010/02/13(土) 00:59:14先読みしてあれば、読み込みの待ち時間が減らせるんです。
0940デフォルトの名無しさん
2010/02/13(土) 01:03:46わかってるよ
でもそのバッファの分だけでしょ
ダブルバッファとか仕組みいれてもどうやってもプログラムが処理するデータ量が多ければ
いずれバッファの中は空っぽになってHDDの読み出し速度になってしまう
むしろバッファ制御の無駄な仕組みが速度低下の原因になる可能性だってある
0941デフォルトの名無しさん
2010/02/13(土) 01:05:40該当 OS のスレでやってほしい。
0942デフォルトの名無しさん
2010/02/13(土) 01:05:540943デフォルトの名無しさん
2010/02/13(土) 01:07:55並列読みなら、処理時間は無くせて
ロード時間だけに出来るんです。
0944デフォルトの名無しさん
2010/02/13(土) 01:08:01うむ
小さいファイルならメモリに載せて・・とかだけど
大きなファイルならハードでどうにかしろって話だよな
0945デフォルトの名無しさん
2010/02/13(土) 01:08:42アルゴリズム?とかそんなんだよ
0946デフォルトの名無しさん
2010/02/13(土) 01:09:17以前オーディオ再生アプリ書いた時ハマった。
結局FILE_FLAG_NO_BUFFERINGして自前でバッファリングしないと使い物にならなかった。
0947デフォルトの名無しさん
2010/02/13(土) 01:37:21テンプレート関数やクラステンプレートのメンバ関数などは
ヘッダファイルに実装を書くことになりますよね?
どうせヘッダファイルに書くなら(そのヘッダの依存性が上がり
再コンパイルのリスクが増えるのは変わらないため)
inline宣言をするかどうかを考える価値が出て来ると思うのですが、
果たしてどんな基準でテンプレート関数をinline宣言すればいいのか分かりません。
短い関数とか言われても今ひとつピンと来ません。
とりあえずEffective C++の指南に基づき
コンストラクタとデストラクタはinlineにはしていませんが。。。
0948デフォルトの名無しさん
2010/02/13(土) 01:39:33依存性切るための変な仕組みなかったっけ?
0949デフォルトの名無しさん
2010/02/13(土) 01:41:31いえ、なかったと思います。。。
0950デフォルトの名無しさん
2010/02/13(土) 01:43:39http://www.02.246.ne.jp/~torutk/cxx/file/insulation.html
依存性を切る仕組みは重要視されててc#なんかでもそういうコンテナフォーマットあるし
0951947
2010/02/13(土) 01:47:14pimplや明示的インスタンス生成explicit instantiationで回避はできます。
ですが、現状>>950のような方法を用いても
完全にテンプレート化された関数はやはりヘッダに書かなければ
ならないと思います。
いずれにせよ
みなさんはどんな基準でヘッダに書いた関数をinline宣言していますか?
0952デフォルトの名無しさん
2010/02/13(土) 01:47:180953デフォルトの名無しさん
2010/02/13(土) 01:52:530954947
2010/02/13(土) 02:00:060955デフォルトの名無しさん
2010/02/13(土) 02:08:520956デフォルトの名無しさん
2010/02/13(土) 02:10:38.netになれてど忘れしてもた
ライブラリを作ってるんだがその内部でネットワーク経由でデータを受信して
呼び出し元に返す場合は内部で使ってるstd::string(もしくはCString)を
返しちゃだめなんだっけ?・・・
0957デフォルトの名無しさん
2010/02/13(土) 02:20:250958デフォルトの名無しさん
2010/02/13(土) 02:24:04いや読み込みはできてるし動いてるんだけど
それをライブラリとして切り離す場合にどうしてたっけかな・・・と思って
Cのころはファイルの読み込みなんかだとサイズを調べて
mallocとかで領域確保してそこへ入れてそれを呼び出し元に渡して・・・
だったけどさ
C++の場合クラスとかになってきてるし、std::stringってクラスぽい動きしてるしで・・・
0959デフォルトの名無しさん
2010/02/13(土) 02:33:27基本的に inline は使わない。
性能に有意な差が出ると確認できたときに付ける。
template だろうとなかろうと判断基準は変わらないし、変えなくていい。
0960デフォルトの名無しさん
2010/02/13(土) 02:50:31exportを実装してようがリンク時コード生成を考えたらビルド時間は変わらないし
0961デフォルトの名無しさん
2010/02/13(土) 02:50:340962デフォルトの名無しさん
2010/02/13(土) 03:12:56書かなくてもインライン化したりするので書かない
0963デフォルトの名無しさん
2010/02/13(土) 03:29:30経験言語:java
vc++を使ってc++の勉強をしているのですが、クラスのポインタにnewとdeleteをすると管理が怖いのでboostのshared_ptrを使いjavaライクにしようかと考えています。
この解決方法は一般的なのでしょうか。それとも一般的にスマートポインタなど使うのは邪道なのでしょうか。
また、スマートポインタに隠蔽することにより隠蔽されたオブジェクトのpublic変数や関数をコード保管機能により呼び出せなくなりました、これの解決方法はあるのでしょうか。
0964デフォルトの名無しさん
2010/02/13(土) 03:41:19逆だろ。わざわざ付ける意味が無いんだよ。
0965デフォルトの名無しさん
2010/02/13(土) 03:44:25スマートポインタを使うことが邪道だということは無いが、 Java ライクにしようという目的は邪道だ。
「管理が怖い」とか、非科学的な判断基準を持ち出すべきではない。
スマートポインタに入れることは隠蔽じゃない。補完の件は知らないが、たいした問題じゃないだろう。
0966デフォルトの名無しさん
2010/02/13(土) 03:46:31オレに逆らうとはいい度胸だな
わざわざ付ける意味が無い証拠は?
0967デフォルトの名無しさん
2010/02/13(土) 03:47:130968デフォルトの名無しさん
2010/02/13(土) 03:50:520969デフォルトの名無しさん
2010/02/13(土) 03:55:51やはりjavaライクにすべきではないのですか。
僕はjavaに慣れ親しんでいるのでコードのすみずみまで頭に叩き込まずともjavaライクであればささいなきっかけでコードの多くの部分を思い出せると考えました。
しかし、他の人にソースを共有する場合は他の人が僕のルールを理解していることはないのは確実なのでそれは良くないことかもしれないと思います。
コード保管は頭の文字をいれるとそれから予測できる変数や関数を列挙してくれる機能なのですが、ポインタがスマートポインタの中にいるので->で参照したときにコード保管できないという意味で隠蔽という言葉を選択しました。
誤解を招くような言葉で申し訳ございませんでした。
0970デフォルトの名無しさん
2010/02/13(土) 03:57:320971デフォルトの名無しさん
2010/02/13(土) 03:59:40Javaライクというのがメモリの管理を自動化したいという意味なら
循環参照に気をつければ
スマポ経由だってインテリセンスは効いてた様な
0972デフォルトの名無しさん
2010/02/13(土) 04:18:56ありがとうございます。自己的な理由ではありますがスマートポインタを採用しようかと思います。
僕の環境では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を参照できました。
なんらかの設定、もしくはアドインのようなものを入れればスマートポインタはインテリセンスできるのでしょうか。
0973デフォルトの名無しさん
2010/02/13(土) 04:28:220974デフォルトの名無しさん
2010/02/13(土) 10:30:36インテリセンスに過度な期待は持たないで。
0975デフォルトの名無しさん
2010/02/13(土) 10:46:460976デフォルトの名無しさん
2010/02/13(土) 10:50:21まぁ解決?してるようだしいいんじゃね
0977デフォルトの名無しさん
2010/02/13(土) 10:52:15流行ってるのかとおもた
寝ぼけてるな俺
0978デフォルトの名無しさん
2010/02/13(土) 11:22:090979デフォルトの名無しさん
2010/02/13(土) 12:01:34じっくり反省しろ
0980デフォルトの名無しさん
2010/02/13(土) 13:24:32インテリセンスって言葉がでたらあぼんする位の勢いで
いいんじゃね?
0981デフォルトの名無しさん
2010/02/13(土) 13:47:24相変わらずだなあ。まったく・・・
0982デフォルトの名無しさん
2010/02/13(土) 18:12:53このtarボールド(kdeプロジェクト)を展開すると、いくつかのソフトが入っているます
その中で、dolphinというソフトをideで見たいのですが、make fileの作り方がわかりません
お力をお貸しください
0983デフォルトの名無しさん
2010/02/13(土) 18:26:33スレ違い。
KDE/Qt
http://pc12.2ch.net/test/read.cgi/unix/980598648/
KDEスレ Part 8
http://pc11.2ch.net/test/read.cgi/linux/1235893560/
0984デフォルトの名無しさん
2010/02/13(土) 18:46:33スレ違いじゃないな
0985デフォルトの名無しさん
2010/02/13(土) 19:43:220986デフォルトの名無しさん
2010/02/13(土) 21:59:42>>968
意味不明だ
要説明
0987デフォルトの名無しさん
2010/02/13(土) 23:18:57C++相談室 part78
http://pc12.2ch.net/test/read.cgi/tech/1266070683/
0988デフォルトの名無しさん
2010/02/13(土) 23:43:24逆だろ。まずはお前から、 template に限って inline を使う基準を分けるメリットを挙げてくれ。
そうじゃないとさっぱりわからん。
0989デフォルトの名無しさん
2010/02/13(土) 23:50:14> 逆だろ。まずはお前から、 template に限って inline を使う基準を分けるメリットを挙げてくれ。
メリットが増えるんじゃなくてinlineにするデメリットが減るって言いたいんじゃないの?
> そうじゃないとさっぱりわからん。
そんなに分からないのか。
merit - demeritの値を考えるとき、
meritが不変でdemeritが小さくなったら
merit - demeritの値は大きくなる
ってことがまさか分からない?
0990デフォルトの名無しさん
2010/02/13(土) 23:53:56inlineしてもinlineしなかったり
inlineしなくてもinlineされたりするから
ぶっちゃけ意味ないだろ
コンパイラによっては強制inline用の予約語とかあるけど
そんな一般性を失ってまで指定してもしょうがないし
0991デフォルトの名無しさん
2010/02/13(土) 23:56:15template に限れば inline にするデメリットが減るのはわかる。最初の >947 から書いてある。
だからと言ってわざわざ template に限って inline を付ける基準を変えることにメリットはないでしょ?
そこがわからない。
0992デフォルトの名無しさん
2010/02/14(日) 00:02:550993960かつ986
2010/02/14(日) 00:19:11クラス定義で手間や重複が最小なのはクラス定義にメンバ関数の定義を含めるやりかた。つまりinline
しかし、依存性を軽減してコンパイルの無駄を抑えるためにメンバ関数の宣言と定義を別にしているわけ
templateでは非inlineにしても依存性を軽減しないので、inlineにしない意味がないといったわけ
0994989
2010/02/14(日) 00:31:12> だからと言ってわざわざ template に限って inline を付ける基準を変えることにメリットはないでしょ?
template に限って inline を付ける基準を変える
なんて誰も言ってないだろ?
むしろ
基準は同じ
だから、
merit - demeritの値が大きくなる場合が増える
templateでは自動的にinlineにすべきという
判定が増えるってこと。
0995デフォルトの名無しさん
2010/02/14(日) 00:34:20inline 指定子を書くべきってこと?
0996デフォルトの名無しさん
2010/02/14(日) 00:48:08クラス定義にメンバ関数の定義を含めるかどうかの話なら同意だ。
クラステンプレートのメンバ関数を分けるための記述はめんどくさいしねぇ。
0997デフォルトの名無しさん
2010/02/14(日) 01:03:30めんどくさい人だな。
template かどうかで inline を付けるかどうかの「判断」を変える必要が無いって言ってるんだよ。
inline の指定によってが性能に有意な差が出ると確認できたところで、コンパイル時の依存関係を
嫌って効率を落とすような判断はしないでしょ。
inline って付ければ必ずメリットが生まれるとでも思ってるのか?
0998デフォルトの名無しさん
2010/02/14(日) 01:29:260999デフォルトの名無しさん
2010/02/14(日) 01:44:151000デフォルトの名無しさん
2010/02/14(日) 01:44:3010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。