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



我想传递一个带有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);
}

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

您可以添加一个构造函数来为您执行此操作。

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

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

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

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

最新更新