Tho*_* T. 12 c++ memory string std dynamic-resizing
我对C++很陌生,但我知道你不能像std :: string类那样只使用内存似乎让你这么做.例如:
std::string f = "asdf";
f += "fdsa";
Run Code Online (Sandbox Code Playgroud)
字符串类如何处理变得越来越大?我假设它分配了一个默认的内存量,如果它需要更多,它会有new
更大的内存块并将自身复制到那个内存块.但是,每次需要调整大小时,必须复制整个字符串并不是很低效吗?我真的不能想到可以做到的另一种方式(但显然有人这样做了).
就此而言,所有stdlib类如vector,queue,stack等如何处理如此透明的增长和收缩?
通常,有一个加倍的算法.换句话说,当它填充当前缓冲区时,它会分配一个两倍大的新缓冲区,然后复制当前数据.与单个分配块增长的替代方案相比,这导致更少的分配/复制操作.
虽然我不知道 std::string 的确切实现,但大多数需要处理动态内存增长的数据结构都是通过完全按照您所说的操作来实现的 - 分配默认内存量,如果需要更多内存,则创建更大的块并复制自己。
解决明显的低效率问题的方法是分配比您需要的更多的内存。已用内存与向量/字符串/列表等的总内存之比通常称为负载因子(也用于哈希表,但含义略有不同)。通常是 1:2 的比例 - 也就是说,您分配所需内存的两倍。当空间不足时,您可以分配当前内存量两倍的新内存量并使用它。这意味着随着时间的推移,如果您继续向向量/字符串/等添加内容,则需要复制的项目越来越少(因为内存创建是指数级的,并且新项目的插入当然是线性的),因此这种内存处理方法所花费的时间并不像您想象的那么长。根据摊销分析的原理,您可以看到m
使用此方法将项目插入到向量/字符串/列表中只是 m 的 Big-Theta ,而不是 m 2。