home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.c++.moderated      Moderated discussion of C++ superhackery      33,346 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 31,537 of 33,346   
   =?ISO-8859-1?Q?Daniel_Kr=FCgler?= to All   
   Re: use string for C API   
   04 Oct 11 15:39:51   
   
   9a88bf92   
   From: daniel.kruegler@googlemail.com   
      
   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  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! ]   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca