3

boost::python::object オブジェクトを C++ 関数に値または const 参照で渡す必要がありますか? ほとんどの場合、C++ では const 参照を介して重要なオブジェクトを渡します。ただし、Boost Python ドキュメントの例では、常に boost::python::object を値で渡します。ですから、その背後に理由があるのか​​ 、それともテキストを読みやすくするためにそのようにしただけなのか疑問に思っています.

4

1 に答える 1

1

boost::python::object は自明なオブジェクトです。

これは PyObject* の単なるラッパーであるため、boost::python::object への参照を持つことは、基本的にポインターへのポインターを持ち運ぶことです。それは少し無意味な間接的です。

参照を渡すことで、参照カウントのインクリメントを回避します。しかし、参照を使用することの間接化は、参照カウントをインクリメントするよりも痛いと思います。

編集

ベンチマークをまとめました:

void by_value(boost::python::object o)
{
    o + boost::python::object(1);
}

void by_const_ref(const boost::python::object & o)
{
    o + boost::python::object(1);
}

-O3 でコンパイルした場合の結果

by-value:       9:215190247
by-const-ref:   5:764022989

一方:

void by_value(boost::python::object o)
{
    for(int x = 0;x < 1000;x++)
    o + boost::python::object(1);
}

void by_const_ref(const boost::python::object & o)
{
    for(int x = 0;x < 1000;x++)
    o + boost::python::object(1);
}

私は得る:

by-value:       5:199017623
by-const-ref:   8:720536289

@eudoxous は正しいです。参照カウントを更新するために必要な書き込みはかなり高価です。ただし、参照を使用することによって引き起こされる間接化にもコストがかかります。しかし、思ったより小さく見えます。

于 2012-07-11T19:13:41.507 に答える