我最近看到我的一位同事std::string用作缓冲区:
std::string receive_data(const Receiver& receiver) {
std::string buff;
int size = receiver.size();
if (size > 0) {
buff.resize(size);
const char* dst_ptr = buff.data();
const char* src_ptr = receiver.data();
memcpy((char*) dst_ptr, src_ptr, size);
}
return buff;
}
Run Code Online (Sandbox Code Playgroud)
我猜这家伙想利用返回字符串的自动销毁功能,因此他不必担心释放分配的缓冲区。
这对我来说有点奇怪,因为根据cplusplus.com,该data()方法返回const char*指向由字符串内部管理的缓冲区的指针:
const char* data() const noexcept;
Run Code Online (Sandbox Code Playgroud)
Memcpying到一个const char指针?AFAIK只要知道我们所做的事情就不会造成伤害,但是我错过了什么吗?这很危险吗?
如果我想将已知或未知大小的数组作为函数参数传递,我对使用哪种语法感到困惑.
假设我有这些变体用于此目的:
void func1(char* str) {
//print str
}
void func2(char str[]) {
//print str
}
void func3(char str[10]) {
//print str
}
Run Code Online (Sandbox Code Playgroud)
使用这些中的每一个有什么利弊?
我今天和我的同事想知道是否可以实现std :: vector来利用小缓冲区优化.通过查看C++ 11草案,我在23.3.1p8阅读
表达式a.swap(b),对于除数组之外的标准容器类型的容器a和b,应交换a和b的值,而不对单个容器元素调用任何移动,复制或交换操作.
这开始似乎取决于小缓冲区优化,但在as-if规则下,我们将被允许仍然对非类类型进行小缓冲区优化(因为我们无法观察到正在完成的复制).下一个文字似乎更难"傻瓜"
在交换之前引用一个容器中的元素的每个迭代器应该在交换之后引用另一个容器中的相同元素.
这是否足以阻止为std :: vector实现小缓冲区优化?有没有其他的路障或最终有可能有SBO的std :: vector?
我知道几个(所有?)STL实现实现了一个"小字符串"优化,而不是存储开始,结束和容量的通常3个指针,如果sizeof(字符),字符串将实际字符数据存储在用于指针的内存中<= sizeof(指针).我处于一种情况,我有很多小矢量,元素大小<= sizeof(指针).我不能使用固定大小的数组,因为向量需要能够动态调整大小并且可能会变得非常大.但是,矢量的中值(非平均)大小仅为4-12个字节.所以适应矢量的"小字符串"优化对我来说非常有用.这样的事情存在吗?
我正在考虑通过简单的蛮力将矢量转换为字符串,即为字符串提供矢量接口.好主意?
哪个是用于保存和访问二进制数据的更好的c ++容器?
std::vector<unsigned char>
Run Code Online (Sandbox Code Playgroud)
要么
std::string
Run Code Online (Sandbox Code Playgroud)
一个比另一个更有效吗?
一个更"正确"的用法吗?
我们每个人都知道,由于它们执行的许多特殊功能以及它们动态增长和减少的能力,我们应该更喜欢所有字符串应用程序的string类C++。什么string是 for characters,vector适用于其他数据类型和类,因为它表现出出色的性能。
但是,是否有任何情况需要我们更喜欢vector<char>(我很少看到)string?