std :: string(size,'\ 0')和s.resize(size)之间的区别?

And*_*zos 7 c++ c++14

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

std::string s(size); // ERROR
Run Code Online (Sandbox Code Playgroud)

之间有什么区别:

std::string s(size, '\0');
Run Code Online (Sandbox Code Playgroud)

std::string s;
s.resize(size);
Run Code Online (Sandbox Code Playgroud)

在共同实施方面的表现?

调整大小会将字符串初始化为所有零字符还是会给它们留下未指定的值?

如果全部为零,是否有任何方法可以构造给定大小的字符串,但是将字符保留为未指定的值?

Dee*_*der 5

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

  • 为什么在第二种情况下还要进行第二次分配呢?在这两种情况下,如果“大小”大于 SSO 缓冲区,则将进行一次分配。 (6认同)
  • *出于同样的原因,“make_unique()”比“new”调用和调用构造函数更快*...您是否正在考虑“make_shared”,因为与“make_unique”应该没有区别。无论如何,我发现您假设默认构造“std::string”将分配内存一次,这非常不寻常,但是允许的。但仍然断言存在差异似乎是错误的。“可能”存在差异,但很可能没有差异,除非您考虑将一些变量初始化为“0”然后更改它们,而不是首先将它们初始化为“size”,这是一个差异。 (6认同)
  • `string()` 现在是 `noexcept`,这意味着它被禁止分配内存(值得庆幸的是)。 (4认同)