通过值或const引用传递boost :: python :: object?

时间:2012-07-11 18:36:05

标签: c++ python boost boost-python

我应该通过值或const引用将boost :: python :: object对象传递给C ++函数吗?我几乎总是通过const引用在C ++中传递非平凡的对象。但是,在Boost Python文档示例中,它们总是按值传递boost :: python :: object。所以我想知道背后是否存在推理,或者他们只是这样做以使文本更容易阅读或其他什么。

1 个答案:

答案 0 :(得分: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是正确的,更新引用计数所需的写入非常昂贵。但是,使用引用引起的间接也有成本。但是,它似乎比我预期的要小。