加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:38:02 所属栏目:百科 来源:网络整理
导读:在C中,在std :: vector上使用C数组的原因很少.其中一个令人信服的原因,至少与C 03一样,是不可能使用向量来分配未初始化的对象数组. std :: vector的“fill”构造函数是: vector(size_type count,const T value = T()) 意思是… int* array = new array[1000
在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());

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读