Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;标准::向量<&燃气轮机;vs新[]性能_C++_New Operator_Stdvector - Fatal编程技术网

C++ c++;标准::向量<&燃气轮机;vs新[]性能

C++ c++;标准::向量<&燃气轮机;vs新[]性能,c++,new-operator,stdvector,C++,New Operator,Stdvector,std::vector和new[]在分配、解除分配和访问时间方面是否存在较大差异?这取决于类型和调用方式标准::向量v(1000000)必须为0百万整数,而新整数[1000000]没有,所以我希望速度有所不同。这是std::vector中的一个地方,如果出于某种原因,您不关心元素的初始值,那么您可能会为不使用的东西付出高昂的代价 如果比较std::vector v(1000000)带有新整数[1000000]()那么我怀疑你会看到很大的不同。重要的问题是其中一个是否比另一个有更优化的循环设置零。

std::vector
new[]
在分配、解除分配和访问时间方面是否存在较大差异?这取决于类型和调用方式<代码>标准::向量v(1000000)必须为0百万整数,而
新整数[1000000]没有,所以我希望速度有所不同。这是
std::vector
中的一个地方,如果出于某种原因,您不关心元素的初始值,那么您可能会为不使用的东西付出高昂的代价


如果比较
std::vector v(1000000)带有
新整数[1000000]()那么我怀疑你会看到很大的不同。重要的问题是其中一个是否比另一个有更优化的循环设置零。如果是这样的话,那么另一个的实现就错过了一个窍门(或者更具体地说,优化器错过了一个窍门)。

new
是一件坏事,因为它违反了单一责任的习惯用法,承担了两个责任:存储分配和对象构造。复杂性是理智的敌人,你通过分离关注点和隔离责任来对抗复杂性


标准库容器允许您这样做,并且只考虑对象。此外,
std::vector
还允许您通过
reserve
/
capacity
接口单独考虑存储

因此,为了清楚地了解程序逻辑,您应该始终选择容器,例如
std::vector

std::vector<Foo> v;

// make some storage available
v.reserve(100);

// work with objects - no allocation is required
v.push_back(x);
v.push_back(f(1, 2));
v.emplace_back(true, 'a', 10);
std::vector v;
//提供一些存储空间
v、 储备(100);
//使用对象-无需分配
v、 推回(x);
v、 推回(f(1,2));
v、 回位(真“a”,10);

不应该有。
std::vector
操作符[]
将是内联的,生成的代码应该非常相似。对其进行分析并查看,但我希望不会有任何差异。除非这是真正的性能关键(我怀疑;访问也不会),否则请使用
std::vector
并避免原始指针。即使存在,这是可以忽略不计的。Vector维护元素的数组和数组列表。而new则分配一个内存位置。后端的Vector也在使用新关键字创建元素。因此,new的工作只是分配,而向量将不仅创建一个新元素,而且还将把它组织成一个数组,增加大小信息,可能还有其他事情。因此,在我看来,vector将花费稍多的时间(在删除或添加元素时重新组织元素方面)。但是
v(N)
newt[N]
是不可比的。您需要将内存和对象分开。因此,真正的比较是与
std::vector v;v、 储备(N)。如果有什么不同的话,
vector
更好,因为它可以让你对对象和内存保持清醒的头脑。@KerrekSB我同意你的观点,但也可以用另一种方式来论证:
T*T=new T[N]
允许你说
T[N]=42
,而对应的
vector.reserve
则没有。@juanchopanza:没有,但是
t[n]
假定您已经拥有一系列对象。我的意思是,是的,你可以考虑一些奇怪的“未初始化存储随机访问”用例,但我相信大多数实际的、真实的算法要么需要一个合理的、现有的范围,要么以某种方式按顺序建立一个集合。如果您真的需要,您可以构建一个未初始化的随机访问接口。@SteveJessop,因此我意识到
new[]
更快地分配大内存块,而
std::vector
提供了方便。当两者相等时,这些方法必须具有交集。问题是:这个交点是否与机器功率成线性关系?如果不是,这是否意味着某些方法更优越?并不是说
new[]
更快地分配大的块
new[]
可以选择普通类型,使它们都未初始化,而
vector
则不初始化(正如Kerrek所说,您可以
reserve
使用vector,但为了使用任何索引,您必须先初始化所有较低的索引)。因此,出于某些有限的目的,
new[]
可以更快,但您不应该留下通常更快的印象。您在这里使用的术语object是什么意思?(我有点困惑。)@DyP:我猜是在3.8的意义上?“标准库容器允许您这样做,并且只考虑存储区域。此外,
std::vector
还允许您通过
reserve
/
capacity
接口单独考虑存储。”简单地搜索+替换对我不起作用:(-至少,听起来很混乱哦,等等,3.8,不是1.8。