Large .init for class containing void-initialized struct
Ali Çehreli via Digitalmars-d
digitalmars-d at puremagic.com
Wed Dec 7 00:46:13 PST 2016
On 12/06/2016 06:10 PM, Basile B. wrote:
> On Wednesday, 7 December 2016 at 00:20:11 UTC, Ali Çehreli wrote:
>> tl;dr; go to the TLDR section below. :)
>>
>> [...]
>>
>> struct S {
>> int i = void;
>> double d = void;
>> ubyte[10_000] a = void;
>> }
>>
>> class C {
>> S s = void; // (Same result even without the =void)
>> }
>>
>> void main() {
>> }
>>
>> [...]
>> 0000000004446260 0000000000003633 T
>> _D4core4time8Duration13_toStringImplMxFNaNbNfZAya
>> 0000000004505140 0000000000003707 T _d_arraysetlengthiT
>> 0000000006681456 0000000000010032 V _D6deneme1C6__initZ
>>
>> Now we have a 10032 byte C.init.
>>
>> Is there a rationale for this or is this an implementation quality
>> issue? Is there a bug already? I could not find one.
>>
>> Also, I failed to find the "= void" documentation e.g. not on the
>> struct spec page.
>>
>> Thank you,
>> Ali
>
> Non initialized classes just don't work. Because of the hidden classes
> fields an initializer is **always** needed. What happens in your example
> is that the initializer size is sub optimal.
Understood. Please confirm whether the following is a bug. Just because
a class uses a *pointer* to a void-initialized struct, the struct gets a
.init:
struct MyStruct(T) {
T[10_000] a = void;
}
// Same with struct
class Outer {
MyStruct!ubyte* s;
}
void main() {
}
0000000006681728 0000000000010000 V
_D6deneme15__T8MyStructThZ8MyStruct6__initZ
Make the struct a non-template and MyStruct.init disappears as expected.
Ali
More information about the Digitalmars-d
mailing list