This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug libstdc++/29688] resize initializes whole array
- From: "fang at csl dot cornell dot edu" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 3 Nov 2006 07:28:55 -0000
- Subject: [Bug libstdc++/29688] resize initializes whole array
- References: <bug-29688-13504@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #5 from fang at csl dot cornell dot edu 2006-11-03 07:28 -------
> There is no argument against the ISO standard, but to a non C/C++ programmer
> it seems a waist of time to reallocate the array and initialize it when one
> wants to add something to an array. Some other compilers will copy the
> existing data into the newly allocated space which seems more in line with
> the text book.
> The application will be changed to avoid the loss of data on a resize of
> arrays, which is a better idea anyway. Thanks for the speedy reply.
If you really want efficient appending to a dynamically allocated array, then
use std::vector, which is capable of pre-allocating more memory than the number
of elements, using the reserve() member function. From looking in the
implementation, N push_back operations result in lg N reallocations, by
doubling the reserve size each time the capacity is exceeded. vector achieves
this by tracking three pointers: beginning, end-of-elements (size),
end-of-storage (capacity). valarray is lighter-weight, having only two
pointers, beginning- and end-of-storage; thus it must reallocate upon resize
(otherwise, how could size() be reported correctly?). I'd only use valarray
when the sizeof(container) is crucial and/or the size of the container is
unlikely/infrequently to change at run-time.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=29688