On Wednesday, 28 May 2014 at 17:33:19 UTC, monarch_dodra wrote:
On Wednesday, 28 May 2014 at 14:36:25 UTC, Chris wrote:
I use Appender to fill an array. The Appender is a class
variable and is not instantiated with each function call to
save instantiation. However, the return value or the function
must be dup'ed, like so:
Appender!(MyType[]) append;
public auto doSomething() {
scope (exit) { // clear append }
// ... do something
append ~= item;
return (append.data).dup
}
My question is whether I save anything with Appender as a
class variable here. I have to .dup the return value (+ clear
the Appender). If I had a new Appender with each function
call, it might be just as good.
public auto doSomething() {
Appender!(MyType[]) append;
// ....
return append.data.
}
Right or wrong?
You might save a little because you avoid the cost of "growing"
your appender repeatedly: Once the appender has come to
"maturity", it will very likely stop growing.
At that point, you only pay for *1* allocation per call to
doSomething. Further advantages include:
- dup has "APPENDABLE" info (whereas appender.data does not).
- less wasted memory: dup uses no more memory than it has to,
whereas Appender may over-allocate, depending on how you fill
it.
The "downside" to your approach is that you keep a handle on a
buffer that can grow, but never shrink. If a at a certain
point, you have to process some particularly large input, then
you'll consume excessive amounts of memory.
monarch_dodra:
Hm. This last point might be an issue. If I process a large input
(text in this case) then I might run into trouble with "append"
as a class variable. I also had a weird bug, because I didn't
clear the memory for overwrite.
TheFlyingFiddle:
"append" is a class variable in _my_ program, not Appender, like
so:
class A {
Appender!(MyType[]) append;
// ...
}