digitalmars.D.learn - Why am I getting different array size depending where I calling?
- matheus (33/33) Nov 14 2022 Hi all,
- Adam D Ruppe (7/17) Nov 14 2022 It isn't. You're casting one to int[] and not casting the other,
- matheus (4/25) Nov 14 2022 Oh my, you're absolutely right... I can't believe I missed that.
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
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
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:Oh my, you're absolutely right... I can't believe I missed that. Thanks Adam, Matheus.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