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

标签 c++ visual-studio dll stl loose-coupling

在 DLL 边界上暴露 STL 容器不是一个好主意,而且通常是不可能的(参见 this answer for whythis one 关于在 dll 边界上暴露 std::list)。我需要能够在使用不同 (VC08/VC10+) 编译器编译的 DLL 和 EXE 之间传递数据; this Q只处理相同的一切。

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

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

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

// in the dll
int func(vecWrapper<double> numbers);

这样做合理吗?大概从函数返回的任何东西都需要一个析构函数(在 dll 端)来销毁它指向的东西。

最佳答案

你已经很成功了。该标准要求 vector 元素在内存中是连续的,除非您使用 vector 的分配器玩游戏,否则 vector 元素不会被堆栈分配,因此始终可以将 vector 的数据表示为开始和结束指针(或一个起始指针和一个大小,如果这是你的事)。您所拥有的应该可以正常工作。

但是,我不确定这有多大用处。 std::vector 除了自动内存管理之外并没有真正为您提供任何东西,而您不想要那个;否则,您在 DLL 中构建的任何 vector 在被破坏时都会释放您的原始 double 组。您可以通过复制数组来解决这个问题,但您已经说过您也不想这样做。 STL 算法在指针上运行良好,因此可能不需要在 DLL 中进行转换。

关于c++ - 在 dll 边界上公开 std::vector - 编译器独立性的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11140057/

相关文章:

c# - 加载/卸载 C dll 时出现 C# 问题

c++ - 在 C++ 中获取当前年份的更优雅的方式

c++ - 从特定文件/类输入代码时是否可以自动中断?

javascript - 如何删除发布版本中的 console.log 行?

java - 链接Matlab和Java : Library JMatLink. dll无法加载

c++ - 在 VC6 中调试来自 VS2008 的 DLL

c++ - 问题插入到 STL::map

c++ - 根据照片以3D计算对象位置

c++ - JNI system.loadlibrary 问题 - 使用 C 库的 native C++ dll

asp.net - 为什么我的嵌套母版页丢失了 CSS 格式?