Moving structs containing strings ...

Frits van Bommel fvbommel at
Mon Apr 24 08:25:13 PDT 2006

Bob W wrote:
> "Derek Parnell" <derek at psych.ward> wrote in message 
> news:c7u4nwvom7ca$.o0vru71wqxwe.dlg at
>> Another solution is to recalculate the addresses of the id strings after
>> changing the length ...
>>  arr=arr[0..2];   // adjust length
>>  foreach( inout Sc s; arr)
>> = s.idz[];
> I'll gladly accept this as a solution, because it will
> utilize existing strings within the structs-array.
> The workaround you have posted earlier allocates
> memory and duplicates strings one by one. That is
> something I would not want to try in real-world
> applications due to obvious reasons.

How about defining the struct like this:

struct Sc { uint val;  char[3] idz;  char[] id() { return idz[0..3]; } }

This turns 'id' into a property instead of a field. This might be 
slightly slower*, but has several advantages:

- It will always return the current string without needing manual updates.
- It doesn't allocate.
- It removes the need to initialize 'id' separately.
- Added bonus: Sc.sizeof is halved. (goes from 16 bytes to 8 bytes)

*) Not necessarily though, it may well be optimized out.

More information about the Digitalmars-d-bugs mailing list