这个问题与这个问题有关,但并不完全相同。
除了与可读性相关的问题之外,使用std::vector<char>
而不是std::string
保存任意二进制数据有什么好处吗?
即与字符串相比,使用向量执行哪些任务更容易/更有效/更好?
除了可读性(不应被低估)之外,我还可以想到使用std::string
over的几个小性能/内存问题std::vector
:
一些现代std::string
实现使用小字符串优化。如果存储的数据大于string
的内部缓冲区,就变成了悲观化,降低了复制、移动和swap
1的效率,无益地增加了sizeof()
。
一个有效的std::string
实现将始终分配比当前大小至少多 1 个字节来存储终止空值(不这样做需要额外的逻辑operator[]
来处理str[size()]
)。
我应该强调,这两个问题都非常小。它们的性能成本很可能会在背景噪音中丢失。但你确实问了。
1如果正在使用小字符串优化,则这些操作需要分支,而在良好的实现size()
中它们没有。std::vector
vector<char>
确实比.string
与, 不同string
,vector<char>
保证在操作期间保留迭代器、引用等swap
。请参阅:可以std::vector
利用小缓冲区优化吗?
除了可读性,并确保另一个维护者不会混淆std::string
. 如果效率是唯一的考虑因素,您当然也可以考虑 char*/malloc。
我能想到的一个潜在问题:
std::string
默认为存储<char>
。如果您以后需要处理另一种类型(例如 unsigned short),您可能需要:
std::basic_string<unsigned short>
(这使您远离正常std::string
处理)使用矢量,您可以简单地将容器更改为std::vector<unsigned short>
.
I think the only benefit you would gain from doing that would the ease of incrementing over the std::vector
of characters, but even that can be done with an std::string
.
You have to remember that even though std::string
seems like an object, it can be accessed like an array, so even accessing specific parts of a string can be done without the use of a std::vector
理想情况下,人们会使用它vector<unsigned char>
来存储任意二进制数据——但我认为你已经知道这一点——正如你提到的旧问题。
除此之外,使用向量肯定会更节省内存,因为字符串会添加一个终止 Nul 字符。由于两者的分配机制不同,性能也可能会提高 - 向量保证连续内存!
除此之外,使用字符串是不正确的,因为调用者/用户可能会无意中调用一些字符串方法,这可能是一场灾难。
正如其他答案所提到的,向量可能会稍微快一些,因为它保证了连续的内存,即使对于小尺寸也是如此,并且不会在最后添加额外的空字节。但是,连接两个字符串比连接两个向量要简单得多(在代码方面):
使用vector
:
vector<char> a, b;
// ...
vector<char> c;
c.insert(c.end(), a.begin(), a.end());
c.insert(c.end(), b.begin(), b.end());
使用string
:
string a, b;
// ...
string c = a + b;