【问题标题】:Squish A Bunch Of Arrays Together C++ [closed]将一堆数组挤在一起 C++ [关闭]
【发布时间】:2014-07-01 18:07:32
【问题描述】:

有没有办法把两块堆分配的内存有效地放在一起?这会比以下更有效吗?

for( unsigned int i = 0; i < LENGTH_0; ++i )
    AddToArray( buffer, array0[ i ] );
for( unsigned int i = 0; i < LENGTH_1; ++i )
    AddToArray( buffer, array1[ i ] );

【问题讨论】:

标签: c++ c++11 memory-management heap-memory


【解决方案1】:

对于逐字节复制内存,memcpy 不会出错。这将是移动内存的最快方式。

但请注意,有几个注意事项。一方面,您必须手动确保目标内存足够大。您必须手动计算对象的大小(使用 sizeof 运算符)。它不适用于某些对象(想到shared_ptr)。在一些原本优雅的 C++11 中,它看起来非常恶心。

你的方法也行得通,应该几乎一样快。

您应该强烈考虑 C++ 的 copy 算法(或其同级算法之一),并使用 vectors 即时调整大小。您可以使用更好的迭代器。同样,它应该几乎与 memcpy 一样快,另外一个好处是它比移动字节要安全得多:shared_ptr 及其同类将按预期工作。

【讨论】:

  • @thirtythreefourty 谢谢:-D
  • “它不适用于某些对象”——这是一种轻描淡写的说法。这将导致非POD 类类型的未定义行为。
  • 技术上是正确的。 ;P 但你是对的;许多数据结构会损坏。
【解决方案2】:

我会做这样的事情,直到被证明变慢:

vector<decltype(*array0)> vec;
vec.reserve(LENGTH_0 + LENGTH_1);
vec.insert(vec.end(),array0,array0 + LENGTH_0);
vec.insert(vec.end(),array1,array1 + LENGTH_1);

取决于存储在 array1 和 array0 中的数据,这可能与为每个数据调用函数一样快甚至更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2017-07-10
    • 2011-04-08
    相关资源
    最近更新 更多