C11和std :: vector构造函数中的值初始化对象

在C中,在std :: vector上使用C数组的原因很少.其中一个令人信服的原因,至少与C 03一样,是不可能使用向量来分配未初始化的对象数组. std :: vector的“fill”构造函数是:

vector(size_type count,const T& value = T())

意思是…

int* array = new array[1000000];

可能比以下效率要高得多:

std::vector<int> v(1000000);

因为向量构造函数必须对整数数组进行零初始化.因此,当使用POD的向量时,没有真正的相当于malloc;你可以得到的最好的是相当于calloc.

C 11似乎已经改变了这个“价值初始化”的概念.在C 11中,std :: vector有一个新的构造函数,它采用单个size_type值,没有认参数.这个“值初始化”矢量中的所有元素. C 11标准区分“初始化值”和“零初始化”.

我的理解是,“值初始化”等同于在T上调用认构造函数.如果T是类似int的POD类型,那么认构造函数只需创建一个未初始化的整数.因此,在C11中,如果T是POD,则显式vector :: vector(size_type count)与malloc完全相同.

不过,我对此的理解是基于C11标准草案,而不是最终标准.

问题:我的理解是否正确?如果T是POD,显式vector :: vector(size_type count)是否提供一个未初始化的数组(类似于malloc)?

解决方法

Question: Is my understanding correct here? Does explicit vector::vector(size_type count) provide an uninitialized array
(similar to malloc) if T is a POD?

不,在这里C 03和C 11之间有区别,但不是这样.不同之处在于,在C 03中,向量T(N)将认构造T,然后使其N个副本填充向量.

而在C 11中,向量T(N)将认地填充该向量N次.对于POD类型,效果是相同的.事实上,我希望对于几乎所有类型的效果是一样的.然而,对于像unique_ptr(仅限移动类型)的东西,差异至关重要. C 03语义将永远不会工作,因为您不能制作一个只移动类型的副本.

所以:

vector<unique_ptr<int>> v(10);

创建一个10个null unique_ptrs的矢量(它们不是彼此的副本).

在罕见的情况下,它有所作为,您需要C 03行为,可以轻松实现:

vector<T> v(10,T());

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...