2

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


1:中型是指小于 100 MB。

4

5 回答 5

5

您可以使用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!
于 2012-04-09T18:23:41.170 回答
3

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

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

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

于 2012-04-09T18:23:45.267 回答
0

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

在紧要关头,我相信您可以boost::shared_ptr使用自定义解除分配器进行自定义,这样您就可以在分配时std::malloc避免初始化开销并解除分配,std::free同时仍然保持shared_ptr带来的好处。

于 2012-04-09T18:25:01.353 回答
0

vector<char>应该可以满足您的目的。如果您希望共享版本避免复制,您可以使用以下内容:

typedef shared_ptr<vector<uint8_t>> ByteArray;

如果您在编译时知道大小,则可以使用array稍微节省空间的大小。

string可以处理可能比向量更合适的空字符。

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

于 2012-04-09T18:28:52.717 回答
0

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

于 2016-06-16T08:32:28.777 回答