Re: use string for C API
Am 04.10.2011 20:50, schrieb gast128@hotmail.com:
Hello all,
Item 16 of Scott Meyers 'Effective STL' describes that a vector can be
used as a buffer for C API (output) functions, since its underlying
memory layout is guaranteed to be the same, i.e.
size_t fillArray(double* pArray, size_t n)
std::vector<double> v(10);
fillArray(&v[0], v.size());
It also explicitly describes that this is only true for vectors and
not for (basic_)string's. This is kinda of pity since strings have
often small string optimizations (e.g. the string in Plauger's STL has
a fixed buffer of 16 characters and switches to the dynamic one if
strings are longer).
As of C++11 the idiom is now safe for std::basic_string as well (But beware of the empty case!). Note that the recommended way of using either of is now via
fillArray(v.data(), v.size());
because this will also work for empty vector/string (Note that the returned pointer value is unspecified for the empty case, so do not rely on the assumption that it would be a nullptr).
Does anyone know if this is still true and that portable c++ code
cannot lean on string's having a compatible c memory layout, or is
this changed in the meantime?
As of C++11 you have now a continuous storage guarantee and the semantics of operator[] is defined equivalently to *(begin() + pos) for pos < size(). This applies to data() and c_str() as well, but extends the validity to the index position size().
Otherwise one has to use a vector (1 allocation, 1 de-allocation and
extra copy) and especially these memory alloc's can be significant
when called a lot (e.g. a million times)
You don't need that anymore.
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]