Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在dll边界上公开std::vector-编译器独立性的最佳实践_C++_Visual Studio_Dll_Stl_Loose Coupling - Fatal编程技术网

C++ 在dll边界上公开std::vector-编译器独立性的最佳实践

C++ 在dll边界上公开std::vector-编译器独立性的最佳实践,c++,visual-studio,dll,stl,loose-coupling,C++,Visual Studio,Dll,Stl,Loose Coupling,在DLL边界上公开STL容器不是一个好主意,通常也不可能(请参阅和关于在DLL边界上公开std::list)。我需要能够传递数据之间的DLL和EXE编译与不同的(VC08/VC10+)编译器;只处理一切相同的问题 暴露它们的最佳方式是什么?向量与列表有点不同,因为内存保证是连续的,所以如果我只需要一个双倍的常量向量,我可以只向dll中的函数提供块的开始和结束指针吗?dll还需要返回一些结构,如向量数组 我想知道一个包含开始和结束指针的结构: template <typename T>

在DLL边界上公开STL容器不是一个好主意,通常也不可能(请参阅和关于在DLL边界上公开std::list)。我需要能够传递数据之间的DLL和EXE编译与不同的(VC08/VC10+)编译器;只处理一切相同的问题

暴露它们的最佳方式是什么?向量与列表有点不同,因为内存保证是连续的,所以如果我只需要一个双倍的常量向量,我可以只向dll中的函数提供块的开始和结束指针吗?dll还需要返回一些结构,如向量数组

我想知道一个包含开始和结束指针的结构:

template <typename T>
struct vecWrapper<T> {
    T*  begin;
    T*  end;
}

// in the dll
int func(vecWrapper<double> numbers);
模板
结构向量包装器{
T*开始;
T*end;
}
//在dll中
int func(向量包装器编号);

这样做明智吗?大概从函数返回的任何内容都需要一个析构函数(在dll端),它会销毁它所指向的内容。

您已经基本搞定了。该标准要求向量元素在内存中是连续的,并且除非您使用向量的分配器玩游戏,否则向量元素不会被堆栈分配,因此始终可以将向量的数据表示为开始和结束指针(或者开始指针和大小,如果您喜欢的话)。你所拥有的应该很好用


然而,我不确定这有多大用处
std::vector
除了自动内存管理之外,实际上并没有提供任何功能,您不希望这样;否则,在DLL中构造的任何向量在销毁时都将取消分配原始的双精度数组。你可以通过复制数组来解决这个问题,但是你说过你也不想这么做。STL算法在指针上运行良好,因此可能不需要在DLL中进行转换。

相关,请阅读:Cheers@JohnDibling,这很好地解释了为什么不直接公开STL容器。因此,问题是如何公开数据本身。我希望连续性的要求使得不需要进一步复制就可以实现。为什么不传递一个普通的旧数组呢?@Rook:因为我更愿意在每一侧使用STL进行构造和处理,而只需要通过指针等来跨越边界。如果在堆上使用数组,就相当于传递开始和结束指针(如我在Q中所考虑的),所以我看不到得到了什么。在堆栈上传递。。。我不知道。我想,它确实在调用代码中提供了自动内存管理,在被调用代码中提供了本地声明的向量,包括返回向量。因此,当传递到dll中的向量超出范围时,它们将被自动销毁,当调用其析构函数(返回dll内部)时,返回的向量也将被销毁。