Jiv*_*son 5 c++ stl vector c++11
在[ C++ 11中的值初始化对象和std :: vector构造函数中,Channel72问,
问题:我的理解是否正确?如果T是POD,显式std :: vector(size_type count)是否提供未初始化的数组(类似于malloc)?
答案是不.
我的问题是,"好的,那是什么?"
Nevin的回应之一暗示回答我的问题.为了澄清,我的问题是,有没有办法使用std :: vector <double>而没有无偿填充分配的内存用零或其他什么?
我不是要求解决方法,比如以零大小启动向量并使用push_back().这并不总是可行的,此外,在这一点上,我想让它理解为没有其他原因,我想让它弄明白.
我不能得到Nevin的建议,一个自定义分配器,来编译.VC++ 2017rc(Dinkum)以其通常难以理解的方式抱怨.关于std :: _ Wrap_alloc的东西.Nevin的代码不完整,我可能不知道如何完成它.在我看到他之前,我编写了自己的自定义分配器,这似乎有效,但我对自己的理解不够自信,不能发誓.
在我对这个问题感到困惑的时候,我本可以为std :: vector编写一个较少教条的替代品,加上Great American Novel的几个章节.
万岁!理查德克里滕救援!他在这个问题上的评论直接导致答案.
零吞噬罪魁祸首是默认的分配器模板,即std :: allocator.所以我们替换它,或用分配器适配器修改它.
我稍微整理了一下代码,并扩展了评论.比尔,请随时发布更全面的答案.但是以下这个技巧非常好.
// Allocator adapter
// Given an allocator A, (std::allocator by default), this adapter
// will, when feasible, override A::construct() with a version that
// employs default construction rather than value-initialization.
// "Feasible" means the object (U *ptr) is default-constructable and
// the default constructor cannot throw exceptions.
//
// Thus it thwarts gratuitous initializations to zeros or whatever.
template <typename T, typename A = std::allocator<T>>
class default_init_allocator : public A {
typedef std::allocator_traits<A> a_t;
public:
// http://en.cppreference.com/w/cpp/language/using_declaration
using A::A; // Inherit constructors from A
template <typename U> struct rebind {
using other =
default_init_allocator
< U, typename a_t::template rebind_alloc<U> >;
};
template <typename U>
void construct(U* ptr)
noexcept(std::is_nothrow_default_constructible<U>::value) {
::new(static_cast<void*>(ptr)) U;
}
template <typename U, typename...Args>
void construct(U* ptr, Args&&... args) {
a_t::construct(static_cast<A&>(*this),
ptr, std::forward<Args>(args)...);
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
352 次 |
| 最近记录: |