LDC, ARM: unnecessary default initialization
Jack Applegame via Digitalmars-d
digitalmars-d at puremagic.com
Sat Aug 19 13:25:03 PDT 2017
On Friday, 18 August 2017 at 17:28:38 UTC, kinke wrote:
> On Friday, 18 August 2017 at 12:09:04 UTC, kinke wrote:
>> On Friday, 18 August 2017 at 09:42:25 UTC, Jack Applegame
>> wrote:
>>> For some reason, the LDC default initializes the structure,
>>> even if initialization of all its members is specified as
>>> void. I believe that this is wrong.
>>
>> Afaik, this has been brought up multiple times already and is
>> so by design. Every aggregate has an init symbol, omitting
>> that (and accordingly the default initialization of all
>> instances) by initializing each field with void doesn't work.
>> The initialization isn't performed fieldwise, but is a bitcopy
>> of T.init.
>> You can skip initialization of specific instances though - `S
>> s = void;` - but again not if `s` is a field of another
>> aggregate.
>
> Sorry, I forgot some workaround code:
>
> void ResetHandler() {
> Foo foo = void;
> foo.__ctor(10);
> // or: std.conv.emplace(&foo, 10);
> }
Thanks for the answer. Also I found another workaround code:
test.d
****************************************
module test;
import core.bitop : volatileStore;
struct Foo {
uint[64] m = void; // no default initialization
static auto opCall(uint a) {
Foo foo = void;
foreach(ref b; foo.m) volatileStore(&b,a++);
return foo;
}
}
void ResetHandler() {
auto foo = Foo(10);
}
****************************************
assembly
****************************************
00000000 <_D4test12ResetHandlerFZv>:
0: b0c0 sub sp, #256 ; 0x100
2: 2000 movs r0, #0
4: 4669 mov r1, sp
6: f100 020a add.w r2, r0, #10
a: f841 2020 str.w r2, [r1, r0, lsl #2]
e: 3001 adds r0, #1
10: 2a49 cmp r2, #73 ; 0x49
12: d1f8 bne.n 6 <_D4test12ResetHandlerFZv+0x6>
14: b040 add sp, #256 ; 0x100
16: 4770 bx lr
****************************************
More information about the Digitalmars-d
mailing list