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,547 of 33,346   
   =?ISO-8859-1?Q?Daniel_Kr=FCgler?= to All   
   Re: use string for C API   
   06 Oct 11 11:37:52   
   
   From: daniel.kruegler@googlemail.com   
      
   Am 05.10.2011 00:39, schrieb Daniel Krügler:   
   > 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).   
      
   Let me clarify here, that the unspecified pointer value applies to   
   vector and array. For std::basic_string the pointer value is   
   specified to be one pointing to a value-initialized character. In this   
   sense, the usage of   
      
   fillArray(&v[0], v.size());   
      
   is defined for basic_string since C++11 even for the empty case. I still   
   recommend to use the   
      
   fillArray(v.data(), v.size());   
      
   because that also works for other containers (array, vector) in the   
   empty case.   
      
   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