【问题标题】:C++ How to add and to an array without copying the data?C ++如何在不复制数据的情况下向数组添加和?
【发布时间】:2017-04-08 21:10:52
【问题描述】:

我已经给出了uint8_t[n] 类型的数据缓冲区。现在我必须在这个数组中添加一个 head ,即之前的 uint8_t 的一个值。但我不想 memcpy 数据!

给定数组:

0x0800 - Start of data buffer
...
0x0900 - End of data buffer

新数组:

0x07ff - Head
0x0800 - Start of data buffer
...
0x0900 - End of data buffer

有没有可能这样做或者内存分配有问题?

【问题讨论】:

  • 如果你不知道你给定的内存块前面是什么,那么插入一个值是一个非常糟糕的主意。
  • 如果您无法控制缓冲区内存的分配数量和位置,那么如果不分配新内存并复制所有内容,这是不可能的。

标签: c++ arrays memory


【解决方案1】:

如果不移动内存对您来说很重要,那么std::deque 可以为您做到这一点:

std::deque(双端队列)是一个索引序列容器,允许在其开头和结尾快速插入和删除。此外,在双端队列的任一端插入和删除都不会使指针或对其余元素的引用无效

std::vector 不同,双端队列的元素不是连续存储的:典型实现使用一系列单独分配的固定大小数组,并带有额外的簿记,这意味着对std::deque 的索引访问必须执行两次指针取消引用,而向量的索引访问只执行一次。

双端队列的存储会根据需要自动扩展和收缩。 扩展双端队列比扩展std::vector 便宜,因为它不涉及将现有元素复制到新的内存位置。另一方面,双端队列通常具有很大的最小内存成本;仅包含一个元素的双端队列必须分配其完整的内部数组(例如,在 64 位 libstdc++ 上为对象大小的 8 倍;在 64 位 libc++ 上为对象大小的 16 倍或 4096 字节,以较大者为准)。

【讨论】:

  • 好主意,但我认为,根据现在已删除的答案中的评论,OP 无法控制他们如何获取数据。他们得到uint8_t 的数组。他们必须将该数组复制到deque
猜你喜欢
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-06
  • 2011-03-24
  • 2021-12-24
相关资源
最近更新 更多