Vin*_*ent 1 c++ standards memory-management sizeof c++11
C++标准提供了std :: vector内容连续存储的保证.但它是否表明总占用内存是:
S = C+N*sizeof(T)
Run Code Online (Sandbox Code Playgroud)
哪里:
换句话说,我是否保证每个元素没有开销?如果我没有这样的保证,有什么理由吗?
编辑:要清楚,如果我以a为例std::list,它通常每个元素存储2个额外的指针.所以我的问题是:这样的实现std::vector是否符合标准?
Ste*_*sop 11
为了有任何这样的保证,标准必须将要求传递给分配器的接口.它没有,所以没有.
但实际上,作为实现质量问题,您希望内存分配器每个分配可能有一个恒定的开销,但没有与分配大小成比例的开销.对此的反例是内存分配器,无论请求的大小如何,它总是使用两倍大小的块.这对于大型分配来说是相当浪费的,但是不能作为用户定义的分配器或甚至作为系统分配器使用::operator new[].N假设矢量容量不合适,它会产生与平均值成比例的开销.
暂且没有分配器,我不相信标准中有任何东西可以说向量不能为每个元素分配(例如)一个额外的字节,并使用它来存储一些标志,用于知道什么用途.正如其他人所说,连续性要求意味着那些额外的字节不能位于向量元素之间.它们必须在分配的一端进行单独分配或全部在一起.
至少有一个很好的理由是标准不禁止通过使用它来存储用于标准不需要的操作的数据来"浪费"空间的实现 - 这样做会排除许多调试技术!