On Wednesday, 11 October 2023 at 02:54:53 UTC, mw wrote:
Hi,
I want to confirm: in the following loop, is the array literal
`a` vs. `b` stack or heap allocated? and how many times?
void main() {
int[2] a;
int[] b;
int i;
While(++i <=100) {
a = [i, i+1]; // array literal
b = [i, i+1];
}
}
Thanks.
a is a static array, therefore it won't allocate any, it's a
memcpy
b will be heap allocated, and it'll do an allocate at each
iteration
```D
void test_b()
{
int[] a;
int i;
while (++i <= 100)
{
a = [i, i + 1];
printf("%p\n", a.ptr);
}
}
```
You can run this, and it'll print a different address each time
If you add `[]` it'll do range based copy (memcpy), but since the
array is not initialized, it has a length of 0, so you only need
to allocate once (either with GC or with malloc)
```D
void test_b()
{
int[] a;
int i;
a.length = 2; // initialize the heap allocated array here
// or with malloc:
// auto ptr = malloc(int.sizeof * 2);
// a = cast(int[]) ptr[0 .. int.sizeof * 2];
while (++i <= 100)
{
a[] = [i, i + 1];
printf("%p\n", a.ptr);
}
}
```
Otherwise you'd get: ``core.exception.RangeError@onlineapp.d(18):
Range violation``
I don't use D with the GC, so my memory about it is probably
foggy, but i'm pretty sure what i said is right, please anyone
correct me if i'm wrong