大体関数ポインタを二個挟んで呼び出すのと同等らしい
2回分で2〜3倍くらいの時間ならまぁそんなもんかと
思ったんだろうが、5倍超えるとなるとちょっと萎える。
あとfunctionのみでもbindと同じくらい遅くなるんだよね。
ただしfunctionにbindした関数を入れた場合でも、
さらに大幅に遅くなったりはしないのが不思議だった。
関数呼び出し単体の時間差を測っても意味無いだろ。
10ns が 50ns になったからって、関数本体の処理が 10us あったらボトルネックにはなり得ない。
いやなりえる。
具体的にはエミュレーターとか仮想マシンのオペコードの処理が
関数ポインタの配列になってた部分を、function+bindに変えたらなった。
>>941 ちっとも具体的じゃないんだけど、その関数の処理は>940の書いている通り10usも掛かっていたのか?
あーすまん。ちゃんと読んでなかった
946 :
デフォルトの名無しさん:2009/01/07(水) 18:06:44
宣伝
mpl::apply_ifが使えなかったので1.32から1.37にアップグレードしてみました。
結果version.hppの中で#define BOOST_VERSIONが10370になったのですが、やっぱりmpl/apply_if.hppが見あたりません。
grepで探してもapply_ifが見あたらないのですが、apply_ifは何をインクルードすれば使えるのでしょうか。
ありがとうございます。
952 :
デフォルトの名無しさん:2009/01/10(土) 11:30:14
953 :
デフォルトの名無しさん:2009/01/10(土) 11:40:36
乙951
954 :
デフォルトの名無しさん:2009/01/10(土) 17:00:40
regex_searchで、後ろから逆順に検索する方法ってありますか?
さっきからreverse iterator使ってみてるんですが、
boost::regex reg("[0-9a-zA-Z]");
boost::match_results<std::string::iterator> results;
regex_search(str.rend(), str.rbegin(), results, reg);
て事ですよね、なんかコンパイル通らなくて・・・て思ったら
boost::match_results<std::string::iterator> results;
ぢゃなくて
boost::match_results<std::string::reverse_iterator> results;
だった・・・。こんな事で1時間はまるとは・・・・・orz
ありがとうorz
reverse iteratorだと1文字のものしかマッチしないんじゃないの?
wchar_t
lambdaの実装を眺めていて変態だというのはわかったのですが、気になったことがあるので教えてください。
たとえば_1+3とか書くとlambda_functorの中でplus_actionが呼ばれるように理解しましたが、
これは要するに、コンパイラが+演算子を適用する代わりにplus_actionというファンクタを勝手に呼び出してくれてるということですよね。
ということは、(_1%2)*2みたいに書くと二段階にファンクタを呼ぶ=関数ポインタを二回探しに行くという理解で正しいでしょうか?
もしそうならpod型なんかが相手だともったいないと思うのですが、コンパイル時の最適化で吸収してくれてたりするのでしょうか。
なんだか書いていてスレ違いなんじゃないかって気もしてきましたが、よろしくお願いします。
>>959 最適化してくれるかどうかなんてコンパイラ依存だろう。
特定の実装について知りたいなら試せばいい。
うむむ、なるほど。たしかに言われてみればコンパイラ依存が大きそうな感じですね。
デバッガの使い方いまいち理解できてないんですが、簡単なコードで奮闘してみます。ありがとうございました。
962 :
デフォルトの名無しさん:2009/01/12(月) 16:15:24
1.36のserializer腐ってないか?
具体的に
964 :
デフォルトの名無しさん:2009/01/12(月) 17:53:09
BOOST_CLASS_EXPORTを使うと、C2371エラーがでまくる
アホだろこれ
ソースを晒せ。
話はそれからだ
966 :
デフォルトの名無しさん:2009/01/12(月) 18:28:08
まあ、たとえばこんな感じでFooを継承したクラスを複数作ったんだが
「error C2371: '`anonymous-namespace'::boost_serialization_guid_initializer_23' : 再定義されています。異なる基本型です。」
とエラーが出るんだよ。ウンコだ
//////////////////////////////////
// Bar.h 派生
#include <boost/serialization/base_object.hpp>
class Bar : public Foo
{
public:
Bar(void);
~Bar(void);
private:
friend class boost::serialization::access ;
template<class Archive> void serialize( Archive& ar, const unsigned int version )
{
ar & boost::serialization::base_object<Foo>(*this) ;
}
} ;
BOOST_CLASS_EXPORT( Bar ) ;
967 :
デフォルトの名無しさん:2009/01/12(月) 18:28:45
ちなみに基底はこれ
//////////////////////////////////
// Foo.h 基底
class Foo
{
private:
friend class boost::serialization::access ;
template<class Archive> void serialize( Archive& ar, const unsigned int version )
{
ar & m_hoge ;
}
} ;
968 :
デフォルトの名無しさん:2009/01/12(月) 19:21:18
自己解決した。
実装をcppのほうに移したらコンパイルが通った。
おまえがうんこだったんだろ
boost::bind について教えてください
int func(int n1,int n2){
return n1 + n2;
}
std::tr1::function<int(int)> pFunc;
pFunc = bind(&func,20,_1)
↑これは出来るのですが
pFunc = bind(&func,20,_2)
↑これが出来ません。
第二引数を固定するbindはどう記述すればよいでしょうか?
971 :
デフォルトの名無しさん:2009/01/15(木) 10:42:16
>>970 根本的に間違って覚えてないか?
pFunc = bind(&func,_1,20);
でやってみ
972 :
デフォルトの名無しさん:2009/01/15(木) 12:43:44
_1 や _2 はbindが返した関数オブジェクトの何番目の引数かってこと
突っ込まれるのが恐い・・・・
やらないか?
974 :
デフォルトの名無しさん:2009/01/15(木) 21:23:03
なにを?
977 :
デフォルトの名無しさん:2009/01/16(金) 09:12:28
981 :
980:2009/01/17(土) 16:14:37
反応無いな……マルチメソッドには興味無いのかな。
上記をポリシーベースに分割してみました。
誰かトランポリン関数の上手い処理の仕方を教えてくれぇ……
shared_ptrでカスタムデリータを使おうと思うのですが、デリータの指定を忘れないようにデストラクタをprotectedにして罠をかけました。
でも、派生させるとデストラクタがpublicになってしまうので罠を素通りしてしまいます。deleter指定を忘れないいいようにする方法はありませんか。
#include <boost/shared_ptr.hpp>
using namespace boost;
class Disposable
{
protected:
virtual ~Disposable(){}
virtual void Dispose(){}
public:
static void deleter(Disposable* Obj)
{
Obj->Dispose();
delete Obj;
}
};
class Disposable2 :public Disposable{};
int _tmain(int argc, _TCHAR* argv[])
{
shared_ptr<Disposable> a1(new Disposable(),Disposable::deleter);//エラーにならない OK
shared_ptr<Disposable> a2(new Disposable());//エラーになる ok
shared_ptr<Disposable> a3(new Disposable2(),Disposable::deleter);//エラーにならない OK
shared_ptr<Disposable> a4(new Disposable2());//エラーにならない。bad !!!!!!!
Disposable a5;//エラーになる ok
return 0;
}
983 :
980:2009/01/17(土) 23:27:08
>982
一番簡単なのは、生でコンストラクトするのは禁止して必ずcreate関数で拵えるようにするのじゃない?
class Disposable {
protected:
void Dispose(){};
~Disposable(){};
struct Deleter {
template<typename T> void operator()(T* target) {
target->Dispose();
delete target;
};
};
public:
static shared_ptr<Disposable> create() {
return shared_ptr<Disposable>(new Disposable, Disposable::Deleter());
};
};
class Disposable2 : public Disposable {
public:
static shared_ptr<Disposable2> create() {
return shared_ptr<Disposable2>(new Disposable2, Disposable::Deleter());
};
};
ちょっと修正
class Disposable {
protected:
Disposable(){};
~Disposable(){};
void Dispose(){};
struct Deleter {
template<typename T> void operator()(T* target) {
target->Dispose();
delete target;
};
};
public:
static shared_ptr<Disposable> create() {
return shared_ptr<Disposable>(new Disposable, Disposable::Deleter());
};
};
class Disposable2 : public Disposable {
private:
Disposable2(){};
~Disposable2(){};
public:
static shared_ptr<Disposable2> create() {
return shared_ptr<Disposable2>(new Disposable2, Disposable::Deleter());
};
};
Disposableを抽象クラスにしないのはなんか気になるなぁ……
なるほど、createを使ってdeleterを隠蔽するのか。1箇所のクラスの定義でcreateの実装を忘れなければ、多数のインスタンスを作るところでミスらないから問題ないってことですね。
そうそう >985
各クラスでcreateを実装し忘れると痛い目に会うけど、newする毎に気を付けるよりはよっぽどマシ。
createをテンプレート関数にして基底クラスに判定用のメンバ突っ込んで
delete時にcreateを通してないかチェックできるようにすれば多少安全になるんでは