我应该通过值或const引用将boost :: python :: object对象传递给C ++函数吗?我几乎总是通过const引用在C ++中传递非平凡的对象。但是,在Boost Python文档示例中,它们总是按值传递boost :: python :: object。所以我想知道背后是否存在推理,或者他们只是这样做以使文本更容易阅读或其他什么。
答案 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是正确的,更新引用计数所需的写入非常昂贵。但是,使用引用引起的间接也有成本。但是,它似乎比我预期的要小。