|
Boost : |
Subject: Re: [boost] [utility] new auto_buffer class --- RFC
From: Peter Dimov (pdimov_at_[hidden])
Date: 2009-03-02 12:32:36
Thorsten Ottosen:
> John Maddock skrev:
>>> - From glancing at the implementation posted to the list, it does not
>>> appear to
>>> fall back to heap allocation once the maximum stack capacity is reached.
>>> push_back() simply asserts that the stack capacity hasn't been used up
>>> yet.
>
> Yes, that is necessary to make push_back() inlinable.
It's also necessary if you want to introduce stack buffer overflow attacks.
Now, I don't question the right of every C++ programmer to be able to
overflow the stack, but I don't like this ability being presented under the
name "push_back".
> I also think this fits most usage scenarios.
I'm not sure. A typical use case for push_back is when the programmer
doesn't know the number of elements in advance.
for x in w
if pred(x)
v.push_back(x)
The typical number of elements satisfying pred may be ~7.1, so making v have
a stack capacity of 8 will eliminate a heap allocation and will be a big
win. But you can't determine the maximum capacity in advance.
The inability to grow also penalizes cases like
for # of rows
v.clear()
read number of elements into n
for each element read it into e, v.push_back(e)
process( v.begin(), v.end() )
In this case the programmer wants to reuse v between the rows to minimize
the number of heap allocations. But there is no way to know what the maximum
n would end up to be.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk