对于stl vector的一些小细节
以下结论都是基于Debian 4.19.132-1 (2020-07-24) x86_64 GNU/Linux,g++ (Debian 8.3.0-6) 8.3.0得出
1、要使用vector来做二维数组的时候,经常会这么写:
vector<vector<int>> dp(3,vector<int>(4));
那么问题来了,这句话一共调用了几次构造函数,申请了几次内存?
调用了5次构造函数
第一次是调用临时变量 vector<int>(4) 的构造函数,申请了sizeof(int)*4的内存
第二次是调用dp的构造函数,申请了sizeof(vector<int>)*3的内存
第三次到第五次都是调用dp[0],dp[1],dp[2]的拷贝构造函数,分别申请了sizeof(int)*4的内存
2、vector内存增长的规律:
_M_check_len(size_type __n, const char* __s) const
{
if (max_size() - size() < __n)
__throw_length_error(__N(__s));
const size_type __len = size() + std::max(size(), __n);
return (__len < size() || __len > max_size()) ? max_size() : __len;
}
因此基本上就是newsize = size + max(size,n),n就是你新插入的长度。当每次只插入一个元素的时候,那么vector的capacity就会以2的指数增长。
3、vector在扩容的时候,是用malloc还是realloc?
根据我的平台环境来看,是用malloc申请个更大的地址
4、vector扩容以后,怎样重新构造对象?
如果有noexcept 的移动构造函数,那就用移动构造,没有的话,就用拷贝构造函数。所以你光写了移动构造函数还不行,一定要noexcept!!