What code have you used to test it, and what is the result you have seen?

I was using this code:

extern(C) void foo(Foo* r)
{
    Foo tmp;
    *r = tmp;
}

And here is the generated assembly (when using "= void"):

push   %rbp
mov    %rsp,%rbp
sub    $0xc0,%rsp
mov    %rdi,-0x10(%rbp)
movabs $0x65a360,%rsi

lea    -0xc0(%rbp),%rdi
mov    $0x15,%ecx
rep    movsq %ds:(%rsi),%es:(%rdi)
movsb  %ds:(%rsi),%es:(%rdi)
movsb  %ds:(%rsi),%es:(%rdi)
movsb  %ds:(%rsi),%es:(%rdi)
movsb  %ds:(%rsi),%es:(%rdi)
lea    -0xc0(%rbp),%rsi
mov    -0x10(%rbp),%rdi
mov    $0x15,%cl
rep    movsq %ds:(%rsi),%es:(%rdi)
movsb  %ds:(%rsi),%es:(%rdi)
movsb  %ds:(%rsi),%es:(%rdi)
movsb  %ds:(%rsi),%es:(%rdi)
movsb  %ds:(%rsi),%es:(%rdi)
leaveq
retq

The problem here is that the code copies the entire object from some static address instead of just the fields that need to be initialized, and that can be a performance problem. The same is true for your void version.

I tried using float[42] instead of int[42] and found out that buffer actually isn't initialized to its default initializer if I use "= void" (the numbers were all 0 instead of NaN), but the performance cost is still there.

Reply via email to