Boost logo

Boost :

From: David Abrahams (david.abrahams_at_[hidden])
Date: 2002-03-08 13:03:40


----- Original Message -----
From: "Howard Hinnant" <hinnant_at_[hidden]>

> On Friday, March 8, 2002, at 12:29 PM, Peter Dimov wrote:
>
> > From: "Howard Hinnant" <hinnant_at_[hidden]>
> >> Meanwhile vector<double> v(10, uninitialized_flag) breaks no vector
> >> invariants. The vector is destructible. The vector elements can
be
> >> assigned into. If your hardware doesn't mind (mine doesn't), you
can
> >> even assign from this uninitialized vector. I can't think of a
reason
> >> why you would want to do that though.
> >
> > You can't v.insert(v.begin(), 5.0) because copying the uninitialized
> > doubles
> > is undefined behavior. The insert() preconditions do not say that
you
> > can't.
> > Something is wrong. :-)
>
> Does passing the vector a chunk of uninitialized memory solve this
> problem?

That wasn't my suggestion:

    Suppose we could hand vector<T> a chunk of memory and tell it "this
    contains memory for N instances of T, the first M of which have been
    constructed", and have it use that memory?

So, in a typical vector

template <class T, class A>
vector<T,A>::adopt(void* elements, size_type length, size_type
initialized = length)
{
    if (this->__start != 0) this->clear();
    this->__start = static_cast<T*>(elements);
    this->__end = this->__start + initialized;
    this->__end_of_storage = this->__start + length;
}

Does this clarify?


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk