Semantics of toString

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Thu Nov 12 11:40:12 PST 2009


Steven Schveighoffer wrote:
> On Thu, 12 Nov 2009 13:46:08 -0500, Andrei Alexandrescu 
> <SeeWebsiteForEmail at erdani.org> wrote:
> 
>>>   From my C++ book, it appears to only use virtual inheritance.  I 
>>> don't know enough about virtual inheritance to know how that changes 
>>> function calls.
>>>  As far as virtual functions, only the destructor is virtual, so 
>>> there is no issue there.
>>
>> You're right, but there is an issue because as far as I can recall 
>> these functions' implementation do end up calling a virtual function 
>> per char; that might be streambuf.overflow. I'm not keen on 
>> investigating this any further, but I'd be grateful if you shared any 
>> related knowledge.
> 
> Yep, you are right.  It appears the reason they do this is so the 
> conversion to the appropriate width can be done per character (and is a 
> no-op for char).
> 
>> At the end of the day, there seem to be violent agreement that we 
>> don't want one virtual call per character or one delegate call per 
>> character.
> 
> After running my tests, it appears the virtual call vs. delegate is so 
> negligible, and the virtual call vs. direct call is only slightly less 
> negligible, I think the virtualness may not matter.  However, I think 
> avoiding one *call* per character is a worthy goal.
> 
> This doesn't mean I change my mind :)  I still think there is little 
> benefit to having to conjure up an entire object just to convert 
> something to a string vs. writing a simple inner function.
> 
> One way to find out is to support only char[], and see who complains :)  
> It'd be much easier to go from supporting char[] to supporting all the 
> widths than going from supporting all to just one.

One problem I just realized is that, if we e.g. offer only put(in 
char[]) or a delegate to that effect, we make it impossible to output 
one character efficiently. The (&c)[0 .. 1] trick will not work in safe 
mode. You'd have to allocate a one-element array dynamically.

Also, many OSs adopted UTF-16 as their standard format. It may be wise 
to design for compatibility.


Andrei



More information about the Digitalmars-d mailing list