Thread overview
Why am I getting different array size depending where I calling?
Nov 14, 2022
matheus
Nov 14, 2022
Adam D Ruppe
Nov 14, 2022
matheus
November 14, 2022
Hi all,

Well my doubt is pretty much the title for the snippet below:

import std.stdio;

void[] getFoo(){
   void[] _ = new void[int.sizeof*2];
   (cast(int[])_)[0] = 2;
   return _;
}

void main() {
    void[] bar = new void[int.sizeof*2];
    (cast(int[])bar)[0] = 1;
    writeln(cast(int[])bar);
    auto foo = getFoo();
    writeln(foo);
    return;
}

Prints:

[1, 0]
[2, 0, 0, 0, 0, 0, 0, 0]

Looking through godbolt.org the ASM generated with both

    void[] bar = new void[int.sizeof*2];

or

    void[] _ = new void[int.sizeof*2];


is the same:

        mov     rdi, qword ptr [rip + TypeInfo_Av.__init@GOTPCREL]
        mov     esi, 8
        call    _d_newarrayT@PLT
        mov     qword ptr [rbp - 16], 8
        mov     qword ptr [rbp - 8], rdx


So why the array generated from getFoo() is 4 times bigger than the other?

Thanks in advance,

Matheus.
November 14, 2022
On Monday, 14 November 2022 at 21:00:38 UTC, matheus wrote:
> void[] getFoo(){
>     writeln(cast(int[])bar);
>     auto foo = getFoo();
>     writeln(foo);
>
> Prints:
>
> [1, 0]
> [2, 0, 0, 0, 0, 0, 0, 0]
>
> Looking through godbolt.org the ASM generated with both
>
> So why the array generated from getFoo() is 4 times bigger than the other?

It isn't. You're casting one to int[] and not casting the other, leaving it as void[], which writeln will interpret as just raw bytes.

Since an int is 4x bigger than a byte, casting it to int shows 1/4 the number of ints.

But the actual array is the same.
November 14, 2022
On Monday, 14 November 2022 at 21:07:42 UTC, Adam D Ruppe wrote:
> On Monday, 14 November 2022 at 21:00:38 UTC, matheus wrote:
>> void[] getFoo(){
>>     writeln(cast(int[])bar);
>>     auto foo = getFoo();
>>     writeln(foo);
>>
>> Prints:
>>
>> [1, 0]
>> [2, 0, 0, 0, 0, 0, 0, 0]
>>
>> Looking through godbolt.org the ASM generated with both
>>
>> So why the array generated from getFoo() is 4 times bigger than the other?
>
> It isn't. You're casting one to int[] and not casting the other, leaving it as void[], which writeln will interpret as just raw bytes.
>
> Since an int is 4x bigger than a byte, casting it to int shows 1/4 the number of ints.
>
> But the actual array is the same.

Oh my, you're absolutely right... I can't believe I missed that.

Thanks Adam,

Matheus.