【问题标题】:Pass boost::python::object by value or const reference?通过值或常量引用传递 boost::python::object?
【发布时间】:2012-07-11 18:36:05
【问题描述】:

我应该通过值还是通过 const 引用将 boost::python::object 对象传递给 C++ 函数?我几乎总是通过 const 引用在 C++ 中传递重要的对象。但是,在 Boost Python 文档示例中,它们总是按值传递 boost::python::object。所以我想知道这背后是否有原因,或者他们只是这样做是为了让文本更容易阅读或其他什么。

【问题讨论】:

    标签: c++ python boost boost-python


    【解决方案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 是正确的,更新引用计数所需的写入非常昂贵。但是,使用引用造成的间接性也是有代价的。但是,它似乎比我预期的要小。

    【讨论】:

    • 引用计数递增/递减是写入,而从(缓存)RAM 读取要便宜得多。无论如何,指针都必须读取,并且指针值存储在靠近引用计数的位置(可能与 shared_ptr 一样)。所以与 shared_ptr 相同的逻辑在这里成立。如果对象的生命周期得到保证,则通过 const ref 传递。
    • @eudoxos,“无论如何都必须[被]读取指针”但是参考你有两个指针,而不是一个。您必须阅读额外的指针。添加了一个基准,表明额外的指针读取比写入要便宜得多,除非你经常这样做。
    猜你喜欢
    • 2011-06-20
    • 2013-09-10
    • 2013-08-01
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    相关资源
    最近更新 更多