Is there something special required to use Appender.clear

FeepingCreature feepingcreature at gmail.com
Mon Jan 28 12:39:56 UTC 2019


On Friday, 25 January 2019 at 14:33:16 UTC, Steven Schveighoffer 
wrote:
> On 1/25/19 3:20 AM, FeepingCreature wrote:
>> On Thursday, 24 January 2019 at 17:49:34 UTC, Ali Çehreli 
>> wrote:
>> Aren't the semantics of .clear that it's invalid to access 
>> references to .data after calling .clear, period? And if not, 
>> then shouldn't they be? Consider if Appender managed its own 
>> memory and held on to previously-allocated arrays while you 
>> were appending, only to free them on .clear. That seems like 
>> something Appender should be allowed to do. If you don't want 
>> it, just reinitialize Appender instead of calling .clear.
>
> You are advised not to. But it's not unsafe, as the memory is 
> still there.
>

That's stupid. Why would you advise me not to, if there's no 
problem with it? Either it should be accepted or it should be 
forbidden, just like warnings.

>> Any reason that the semantics of .clear should be different 
>> for a starting array? Anyway if so, I'd prefer to just make 
>> that a runtime error.
>
> Yes, because Appender doesn't know where that memory comes 
> from. A string could be, for instance, passed to another thread 
> and being used, you wouldn't want to overwrite it.
>

In which case, you can't reuse the Appender and should not call 
`clear`! It seems like we're gimping functionality of a very 
basic tool for memory efficiency for the sake of not confusing 
users. This rarely pays off.

> Generally speaking, overwriting immutable data is UB in D 
> anyway.
>
> Making it a runtime error would be possible, but there has to 
> be a good reason to make it that way.
>
>> 
>> I'm mostly fishing around if anyone has an objection to a PR 
>> to change this.
>
> Without good reasons to change, I don't see why it would be 
> accepted.
>
> Maybe you can describe your use case?
>

My use case is simply the standard usecase of Appender: I want to 
build up an array in a way that reduces GC churn. Maybe it's an 
array of structs that contain const members that I'll serialize 
to JSON and send on a socket. In that case, I know for a fact 
that no references will hang around past the serialization. 
That's what clear _is for._ I don't see why this would be 
different with const or immutable data; if you hold references 
past .clear being called you're in trouble *anyways.*

I consider initializing Appender with an array referencing 
immutable data a borderline error anyways. The entire point of 
Appender is that it caches capacity data of GC managed memory, 
which is never immutable. On the first append to an 
immutable-memory array, it has to reallocate *anyways*. There is 
no benefit to initializing an Appender with immutable memory over 
just appending it first thing, unless you never plan to append to 
it ever.


More information about the Digitalmars-d-learn mailing list