www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Why am I getting different array size depending where I calling?

reply matheus <matheus gmail.com> writes:
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.
Nov 14 2022
parent reply Adam D Ruppe <destructionator gmail.com> writes:
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.
Nov 14 2022
parent matheus <matheus gmail.com> writes:
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.
Nov 14 2022