使用具有string.reserve()的字符串实例化结构

时间:2018-06-22 03:32:47

标签: c++ string memory-management

我想使用string.reserve(1000)传递字符串,并确保在将其传递到不同结构时分配内存。是否有一种方法可以在每次实例化后都无需显式地执行此操作?

我想避免这样做:

struct Prefix{
  std::string path;
};

int main() {
  std::string path = "hel";
  path.reserve(1000);
  std::cout << path.capacity() << "\n"; // 1000

  Prefix x = {path};
  std::cout << x.path.capacity() << "\n"; // 15
  x.path.reserve(1000);
  x.path += somestring;
  Prefix y = {x.path};
  std::cout << y.path.capacity() << "\n"; // 15
  y.reserve(1000);
}

2 个答案:

答案 0 :(得分:3)

您必须显式地执行此操作,复制std::string时也不需要编译器也复制容量。

您可以添加一个构造函数来为您完成。

struct Prefix{
  std::string path;
  Prefix(const string& p) : path(p) { path.reserve(p.capacity()); }
};

答案 1 :(得分:0)

如果不再需要原始字符串,则应移动而不是复制。

Prefix x = {std::move(path)};

从技术上讲,这不能保证保留容量,但是很难想象有理智的实现将无法正常工作。 (而且,SSO不会对此产生影响,它只是始终强制执行最小容量)。