许多语言和框架提供“字节数组”类型,但C ++标准库不提供。什么类型适合用于中型 1 ,可调整大小的字节数组以及如何有效地使用该类型? (特别是:分配,作为参数传递和破坏)
1:中等大小我的意思是小于100 MB。
答案 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/Rope,http://www.aoc.nrao.edu/php/tjuerges/ALMA/STL/html-3.4.6/rope.html,这可能更合适。
答案 4 :(得分:0)
使用unique_ptr有性能原因,至少对于相对较大的缓冲区而言。有关详细信息,请参阅https://stackoverflow.com/a/35798248/1992615。