Cython & C++:通过引用传递

Posted

技术标签:

【中文标题】Cython & C++:通过引用传递【英文标题】:Cython & C++: passing by reference 【发布时间】:2014-03-10 08:50:16 【问题描述】:

我是 Cython 和 C++ 的菜鸟,所以我对参数传递有疑问。我想避免在以下情况下传递参数的副本:

# somefile.pyx
#distutils: language = c++
from libcpp.vector cimport vector

def add_one(vector[int] vect):
    cdef int i
    n = vect.size()
    for i in range(n):
        vect[i] += 1

cdef vector[int] v
for i in range(100000):
    v.push_back(i)
add_one(v) # <-- ??

我希望方法 add_one 只修改 v “就地”。我相信在 C++ 中,您可以通过在参数前面加上 &amp; 来实现这一点,这意味着对指针的任何更改都会传递给指针。这样,您不必担心传递指针或实际对象,即

add_one(v); # in c++

我可以在 Cython 中做同样的事情吗,还是必须将 arg 类型显式更改为引用,即def add_one(vector[int]* vect)

【问题讨论】:

关于cython-users的一些相关问题:"Question about pass-by-reference" 【参考方案1】:

找到了我自己问题的答案。显然,您可以通过引用传递,但函数必须是 cdef'ed,而不是 def'ed。即

# somefile.pyx
#distutils: language = c++
from libcpp.vector cimport vector

cdef void add_one(vector[int]& vect):
    cdef int i
    n = vect.size()
    for i in range(<int>n):
        vect[i] += 1

cdef vector[int] v
for i in range(100000):
    v.push_back(i)
add_one(v)

【讨论】:

我为 std::string 做 pass-by-ref 但不能在函数内改变它的值

以上是关于Cython & C++:通过引用传递的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cython 时如何将一个 C++ 类(引用)传递给另一个?

如何通过cython接口返回对象引用的c ++函数

如何通过 cython 将 numpy 数组列表传递给 c++

C++ 和 QT4.5 - 传递 const int& 过大?通过引用传递是不是有助于信号/插槽?

C++ 通过引用传递数组

在 C++ 中,通过引用传递 const long double 是不是很好?