C++相当于Java的System.arraycopy

Nol*_*son 7 c++ java arrays

我正在尝试移植一些大量使用System.arraycopy方法的Java代码,并想知道C++中是否存在等价物.基本上我想要有n个字节数组并将它们组合成一个大数组.每个初始数组都可以是可变长度的,所以我不想经历计算结束数组长度的箍,然后一次填充整个数组一个位置,因为这感觉相当慢,我敢肯定这个操作已经优化.但是,我找不到这种优化是什么(虽然我可能会使它变得比它应该更复杂).

这里有一些伪(Java)代码来说明我想要做的事情.

byte[] a = new byte[]{0x00, 0x01, 0x02};
byte[] b = new byte[][0x03, 0x04, 0x05];
byte[] ab = new byte[a.length+b.length];
System.arraycopy(ab, 0, a, 0, a.length);
System.arraycopy(ab, a.length+1, b, 0, b.length);
//Now, I would expect ab to look like {0x00, 0x01, 0x02, 0x03, 0x04, 0x05}
Run Code Online (Sandbox Code Playgroud)

就像我说的,这在C++中可能很简单,但我会做很多次,并希望确保我尽可能高效地完成它.

dic*_*oce 5

给定a_len和b_len(包含a和b的字节长度),以及足以容纳两个数组的dst缓冲区,可以使用memcpy.注意:这还取决于dst被声明为指向字节大小数据的指针.

memcpy( dst, a, a_len );
memcpy( dst+a_len, b, b_len );
Run Code Online (Sandbox Code Playgroud)

这适用于原始类型(因为它看起来像是在复制字节数组)...如果需要复制对象,请查看std :: copy <>().

  • std :: copy在原始类型上也能正常工作. (5认同)
  • 在libstdc ++中查找`std :: copy`,我发现了以下注释:"这个内联函数将在可能的情况下归结为对@c memmove的调用.如果失败,如果传递了随机访问迭代器,那么循环计数将是已知(因此是编译器优化的候选者,例如展开).结果可能不包含在[first,last]中;应该使用copy_backward函数." (3认同)
  • 当然,当T是基本类型时,库实现必须具有专门的std :: copy来执行简单的memcpy,不是吗?如果没有,那么优化器必须看到生成的std :: copy代码等同于memcpy? (2认同)