微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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());

原文地址:https://www.jb51.cc/c/114185.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐