【问题标题】:Instantiating struct with string that has string.reserve()使用具有 string.reserve() 的字符串实例化结构
【发布时间】:2025-12-15 12:45:01
【问题描述】:

我想用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);
}

【问题讨论】:

    标签: c++ string memory-management


    【解决方案1】:

    你必须明确地这样做,复制std::string时,编译器也不需要复制容量。

    你可以添加一个构造函数来为你做这件事。

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

    【讨论】:

    • 容量是变量怎么办?我必须改用一个类吗?
    • @user18764 你说的容量是一个变量是什么意思?
    【解决方案2】:

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

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

    这在技术上并不能保证保留容量,但很难想象一个理智的实现会不起作用。 (不,SSO 不会影响这一点,它只是始终强制执行最小容量)。

    【讨论】: