c – allocator.construct循环是否等于std :: uninitialized_copy?

c – allocator.construct循环是否等于std :: uninitialized_copy?,第1张

概述在此上下文中,T是某种类型,而分配器是该类型的分配器对象.默认情况下,它是std :: allocator< T>但这不一定是真的. 我有一块allocator.allocate(n)获得的内存.我还有一个T对象的容器con(例如,std :: vector< T>).我想用T对象初始化那块内存. 存储块的位置存储在T *数据中. 这两个代码示例是否始终相同? #include <memory> 在此上下文中,T是某种类型,而分配器是该类型的分配器对象.默认情况下,它是std :: allocator< T>但这不一定是真的.

我有一块allocator.allocate(n)获得的内存.我还有一个T对象的容器con(例如,std :: vector< T>).我想用T对象初始化那块内存.

存储块的位置存储在T *数据中.

这两个代码示例是否始终相同?

#include <memory>// example 1std::uninitialized_copy(con.begin(),con.end(),data)// example 2std::vector<T>::const_iterator in = con.begin();for (T* out = data; in != con.end(); ++out,++in) {    allocator.construct(out,*in);}

对于这两个?

#include <memory>T val = T(); // Could be any T value// example 3std::uninitialized_fill(data,data + n,val)// example 4for (T* out = data; out != (data + n); ++out) {    allocator.construct(out,val);}
@H_301_15@解决方法 根据 this explanations他们应该这样做,因为allocator :: construct被称为构造对象而std :: uninitialized …也构造了对象.但是我不知道,在实现你自己的allocator :: construct时,标准是什么以及你有什么自由.

编辑:好的,C 03标准在第20.1.5节§2表32中说明,构造(p,t)应该与new((voID *)p)T(t)具有相同的效果(对于任何符合标准的分配器),而不仅仅是std :: allocator).在20.4.4.1§1中,uninitialized_copy应该具有相同的效果

for (; first != last; ++result,++first)    new (static_cast<voID*>(&*result))            typename iterator_traits<ForwardIterator>::value_type(*first);

在20.4.4.2§1中,uninitialized_fill具有的效果

for (; first != last; ++first)    new (static_cast<voID*>(&*first))            typename iterator_traits<ForwardIterator>::value_type(x);

所以我认为这并没有为他们留下任何不同的行为空间.所以回答你的问题:是的,确实如此.

总结

以上是内存溢出为你收集整理的c – allocator.construct循环是否等于std :: uninitialized_copy?全部内容,希望文章能够帮你解决c – allocator.construct循环是否等于std :: uninitialized_copy?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241237.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存