c++ - std::string(size, '\0') 和 s.resize(size) 的区别?

标签 c++ c++14

与 std::vector 不同,std::string 不提供采用大小的一元构造函数:

std::string s(size); // ERROR

有什么区别:

std::string s(size, '\0');

std::string s;
s.resize(size);

就他们在常见实现方面的表现而言?

resize 会将字符串初始化为全零字符还是将它们保留为未指定的值?

如果全为零,有什么方法可以构造一个给定大小的字符串,但让字符具有未指定的值?

最佳答案

有一个区别,如在 std::string s(size, '\0'); 中,字符串所需的所有内存都可以一次分配。但是,对于第二个示例,如果 size 大于为小字符串优化存储的字符数量,则可能必须执行额外分配,尽管这是实现定义的,并且绝对不会更多在符合标准的 C++ 17 实现中在这方面表现出色。但是,第一个示例更简洁,性能可能更高,因此它可能更可取。调用 s.resize(size); 时,所有新字符都将使用 char 的默认构造函数(又名 '\0')进行初始化。无法使用未指定的值初始化 string

关于c++ - std::string(size, '\0') 和 s.resize(size) 的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667122/

相关文章:

c++ - 如何连接两个程序(c++、qt)

c++ - 了解 C++ (Linux) 中的 fork、exec 和 wait

c++ - 为什么互斥锁和条件变量可以轻松复制?

c++ - enable_if 模板参数是 lambda(具有特定签名)

c++ - 调用 COM Release() 函数后指针是否应该设置为空?

c++ - 将一个类的对象添加到另一个类的数据

c++ - 保持对同一实例 C++ 的引用

c++ - 什么是已删除函数,为什么只有我传递文件的函数才被视为已删除?

具有非静态成员初始值设定项的类的 C++11 聚合初始化

c++ - 为函数 Y 的参数 X 给出的默认参数