【问题标题】:Boost Circular Buffer pointer access (c++)提升循环缓冲区指针访问 (c++)
【发布时间】:2017-10-13 02:57:22
【问题描述】:

我想使用 Boost 循环缓冲区来存储由硬件 API 生成的数组。 API 获取内存位置的地址并相应地推送数组。所以我有以下内容:

typedef unsigned char API_data [10];

boost::circular_buffer<API_data> data(10);
boost::circular_buffer<API_data>::iterator it = data.begin();

但我无法将指针 it 传递给 API,因为:

不存在从“boost::cb_details::iterator&lt;boost::circular_buffer&lt;API_data, std::allocator&lt;API_data&gt;&gt;, boost::cb_details::nonconst_traits&lt;boost::container::allocator_traits&lt;std::allocator&lt;API_data&gt;&gt;&gt;&gt;”到LPVOID 的合适转换函数。

API 需要 LPVOID 类型的指针,但 it 指针的类型不同。

【问题讨论】:

  • it 不是任何类型的指针。
  • 您可能可以使用&amp;*it 获取缓冲区的开始,但是虽然这很可能会编译,但我不希望它能够工作,因为循环缓冲区不仅是缓冲区,它还有一个开始和结束索引。而这些boost为你维护的索引也必须由硬件正确更新才能达到你想要的效果。
  • 谢谢你们的投入!我假设 it 是一个指针,因为 boost 循环缓冲区文档中的示例取消引用 it 以获得存储在该位置的值。除了令人困惑之外,我没有足够的经验来找到提升循环缓冲区文档。

标签: boost iterator buffer circular-buffer


【解决方案1】:

循环缓冲区 API 类似于 ::std::vector API。但是有一个问题!首先,存储在循环缓冲区中的项目必须是可复制分配的,因此您不能在其中存储原始数组。其次,您在构造函数中提供容器容量,而不是初始容器大小,因此在尝试将指针传递给存储项之前,您需要确保它存在。如果缓冲区已满,则推入循环缓冲区可能会丢弃最旧的项目,而 std::vector 将始终增长。然后你可以获取一个推送项的引用并将其转换为指向 void 的指针。

using API_data_buffer = ::std::array< unsigned char, 10 >;

::boost::circular_buffer< API_data_buffer > buffers(10); // buffers is still empty!
buffers.push_back();
auto & api_data_buffer{buffers.back()};
auto const p_void_api_data{reinterpret_cast< void * >(reinterpret_cast< ::std::uintptr_t >(api_data_buffer.data()))};

【讨论】:

  • 感谢@VTT 提供此信息。我不确定是否可以将原始数组存储在循环缓冲区中,并且还在考虑使用std::vector。所以我会相应地进行。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多