许多语言和框架都提供“字节数组”类型,但 C++ 标准库没有。什么类型适合用于中等大小的1、可调整大小的字节数组,我如何有效地使用该类型?(特别是:分配,作为参数传递和销毁)
1:中型是指小于 100 MB。
您可以使用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!
许多语言和框架都提供“字节数组”类型,但 C++ 标准库没有。
你错了,C++ 有一个字节数组类型: std::vector<unsigned char>
,它的存储保证是连续的(如果你不需要这个条件,还有其他选择)。您可能想阅读有关引用、移动语义、返回值优化和复制省略的内容,以了解如何有效地处理这些内容。
注意:在 C++ 中,一个字节是一个char
(有符号或无符号)。它可能不是 8 位长,您可以通过CHAR_BITS
宏获取其大小。
我建议使用std::deque<uint8_t>
而不是,std::vector<uint8_t>
因为后者需要连续的内存块。我会避免分配大块内存,new
因为它会使用默认构造函数初始化内存块,这可能比你想要的要贵一点。
在紧要关头,我相信您可以boost::shared_ptr
使用自定义解除分配器进行自定义,这样您就可以在分配时std::malloc
避免初始化开销并解除分配,std::free
同时仍然保持shared_ptr
带来的好处。
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,这可能更合适。
使用 unique_ptr 有性能原因,至少对于相对较大的缓冲区。有关详细信息,请参阅https://stackoverflow.com/a/35798248/1992615。