Cython & C++: passing by reference
10,911
Found the answer to my own question. Apparently, you can pass by reference, but the function MUST be cdef
'ed, not def
'ed. i.e.
# 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)
Author by
richizy
Updated on June 16, 2022Comments
-
richizy about 2 years
I am a noob with Cython and C++, so I have a question on argument passing. I want to avoid passing a copy of an argument in the following scenario:
# 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) # <-- ??
I want the method
add_one
to just modifyv
"in-place." I believe in C++, you can achieve this by pre-pending the argument with&
, which means that any changes to the pointer is passed to the pointee. That way, you don't have to worry about passing a pointer or the actual object, i.e.add_one(v); # in c++
Can I do the same in Cython, or do I have to explicitly change the arg type to a reference instead, i.e.
def add_one(vector[int]* vect)
?