将 std::vector<int> 从原始内存转换为数组[重复]

Posted

技术标签:

【中文标题】将 std::vector<int> 从原始内存转换为数组[重复]【英文标题】:Converting a std::vector<int> into an array from raw memory [duplicate] 【发布时间】:2018-06-13 10:41:38 【问题描述】:

我正在为使用 ctypes 的 c++ 库开发 python 接口。我知道不推荐这样做,但我不能修改有问题的 dll,所以一切都必须在 python 包装器中发生。

假设我们将这个函数编译到 dll 中:

vector<int> vectortest() 
    return  1, 2, 3 ;

我的 python 脚本看起来像这样:

# [ setup dll ... ]
VectorTest.restype = ct.c_ulonglong * 32 

# set the return type to 64bit unsigned 
# integer array with 32 elements (this is just for debugging atm.)

vec = VectorTest() # call the c++ function, vec should now contain the returned memory

for i in range(0, 32): # print all the values
    print(vec[i])

print('diff1', vec[3] - vec[0]) # this value never changes

print('diff2', vec[15] - vec[4]) # this value never changes

现在我只是转储返回的内存以尝试找到 begin() 和 end() 指针,因为从技术上讲,这就是我找到数组值所需的全部内容。

这是一个输出示例:

754548928240
2850274634992
0
754548928400
1545446976
0
0
140731499719200
0
165212429600621
0
0
0
0
0
1545365980
2850237907016
2850274763904
2850273274168
0
751619281153
0
2850273493592
0
2847563317248
0
2850273493592
140731499719200
2850273274168
754548929040
0
2850238680016
diff1 160
diff2 -80996

底部的差异值都与向量大小无关,因此第一个和第四个元素不能是开始和结束指针。我还尝试取消引用并打印位于内存位置的值,但从未找到值 1、2、3。

我要问的是:

std::vector 到底是如何存储在内存中的?

有没有更好的解决方法,不需要修改 c++ dll?

【问题讨论】:

所以,为了回答您的第一个问题,它是连续存储的。 向量不必必须存储开始和结束,它可以很好地存储开始和大小。 @VishaalShankar 不过,这不是整个问题,我在考虑如何存储向量的元数据,而不是实际的数组元素。 @Jontahan - 我们不知道,它因实现而异。 C++ 标准通常描述应该发生什么,而不是如何实现它。 请不要添加无关的语言标签。 C 既不是 C++ 也不是 Python。 【参考方案1】:

YiFei 建议创建另一个包含向量相关函数的 C++ dll,然后将 python 脚本绑定到该 dll。我会继续这样做,所以我认为这是解决问题的方法。感谢所有参与的人!

编辑:此解决方案已实施并且运行良好。

【讨论】:

在不确定它们是否有效之前不要急于发布解决方案。 抱歉,忘记更新话题了,谢谢提醒。

以上是关于将 std::vector<int> 从原始内存转换为数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 std::vector<thrust::device_vector<int>> 转换为 int**?

将 std::vector<int> 设置为一个范围

将 std::vector<int> 的每个值重置为 0 的最快方法

将 std::stack 复制到 std::vector

将 std::vector<int> 从原始内存转换为数组[重复]

我可以制作一个线程安全的 std::atomic<vector<int>> 吗?