在现代C ++中处理中型字节数组的正确方法是什么?

时间:2012-04-09 18:19:48

标签: c++ c++11

许多语言和框架提供“字节数组”类型,但C ++标准库不提供。什么类型适合用于中型 1 ,可调整大小的字节数组以及如何有效地使用该类型? (特别是:分配,作为参数传递和破坏)


1:中等大小我的意思是小于100 MB。

5 个答案:

答案 0 :(得分:3)

您可以使用std::vector<unsigned char>,也可以使用@Oli建议的std::vector<uint8_t>。是的,你可以传递它,而不复制整个内容。

void f(std::vector<unsigned char> & byteArray) //pass by reference : no copy!
{
     //
}

std::vector<unsigned char>  byteArray;
//...
f(byteArray); //no copying is being made!

答案 1 :(得分:3)

  

许多语言和框架提供“字节数组”类型,但C ++标准库不提供。

你错了,C ++有一个字节数组类型:std::vector<unsigned char>,它的存储保证是连续的(如果你不需要这个条件,还有其他选择)。您可能希望阅读有关引用,移动语义,返回值优化和复制省略以了解如何有效地处理这些内容。

注意:在C ++中,一个字节是char(有符号或无符号)。它可能不是8位长,您可以通过CHAR_BITS宏获取其大小。

答案 2 :(得分:0)

我建议使用std::deque<uint8_t>代替std::vector<uint8_t>,因为后者需要连续的内存块。我会避免使用new分配大块内存,因为它会使用默认构造函数初始化内存块,这可能比你想要的贵一点。

在紧要关头,我相信您可以使用自定义解除分配器自定义boost::shared_ptr,以便您可以使用std::malloc进行分配,从而避免初始化开销并使用std::free解除分配,同时仍保持良好状态shared_ptr带来了这一点。

答案 3 :(得分:0)

vector<char>对您的目的应该没问题。如果您希望共享版本避免复制,可以使用以下命令:

typedef shared_ptr<vector<uint8_t>> ByteArray;

如果您在编译时知道大小,则可以使用array,这样可以节省更多空间。

同样string可以处理空字符,这些空字符可能比矢量更合适也可能不合适。

某些扩展实现有一个绳索实现http://en.wikipedia.org/wiki/Ropehttp://www.aoc.nrao.edu/php/tjuerges/ALMA/STL/html-3.4.6/rope.html,这可能更合适。

答案 4 :(得分:0)

使用unique_ptr有性能原因,至少对于相对较大的缓冲区而言。有关详细信息,请参阅https://stackoverflow.com/a/35798248/1992615