【问题标题】:using deque with C library将双端队列与 C 库一起使用
【发布时间】:2012-06-17 19:38:36
【问题描述】:

假设我有一个结构

struct s
{
     std::deque<Object> q; //won't work  with C library
}

如果带有 std::deque 的结构是使用 C 库初始化的,那么它将不起作用。

struct s
{
     std::vector<Object> v; //would work with C library
}

但是,这种带有 std::vector 的结构可以与 C 库一起使用。 我认为这是因为 deque 中的元素不连续,而 vector 中的元素是连续的。我认为这可能是一个原因,但不确定。

【问题讨论】:

  • 你的问题太模糊了......你所说的“使用 C 库工作”是什么意思。此外,前缀是 std::,而不是 stl::。
  • 请编辑您的帖子...并具体说明您想要什么以及您想说什么。

标签: c++ c stl vector deque


【解决方案1】:

S 的两个版本都不能与 C 库一起使用。
这是因为 C 对类的布局方式(甚至它们中的内容)没有任何概念。

如果您传递元素的地址,Vector 可以与 C 库一起使用。因为所有元素都在连续内存中,所以它看起来像一个普通的指针,因此任何接受指针的 C 函数都可以工作。

struct Object { /* NORAML POD Object */ };

extern "C" void cFunctionCall(Object* data, size_t size);


std::vector<Object>   v;
// initialize v

cFunctionCall(&v[0], v.size()); // This will work because all members of v
                                // are in contiguous memory

【讨论】:

  • +1。另一件值得指出的事情:S 的向量版本可能在某些特定平台上“与 C 库一起工作”,只是因为 vector 的布局恰好以“Object *begin”开头.然而,与内容的连续存储不同,这显然不能保证,这只是一个巧合,所以当他升级到下一个版本的编译器时,他可能会尝试将“size_t len”作为 Object* 访问,如果他幸运的话它会立即崩溃。
  • @abarnert:实际上向量中元素的连续存储是由标准保证的。对于这个用例。 但是带有向量的 S 版本永远不会工作,因为它在内部包含指针而不是一组对象。
  • 重读我的评论。我说过,与内容的连续存储(保证)不同,向量对象本身的任何特定布局都不能保证。
  • 另外,我不确定“它在内部包含指针而不是一组对象”是什么意思。它包含的是一个向量,内联。这看起来像什么取决于实现。在许多情况下,它将是一个对象指针(指向向量的开头),然后是其他指针和/或大小(指向存储和容量的末尾)。如果您编写的 C 代码将单个 vector 视为对象指针,它将起作用(在那些实现上,然后在不同的实现上严重失败)。
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 2017-05-06
  • 1970-01-01
  • 2018-07-02
  • 2010-12-28
  • 2016-03-11
  • 1970-01-01
  • 2015-05-01
相关资源
最近更新 更多