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.

Reply via email to