miscellaneous array questions...

Johan j at j.nl
Tue Jul 21 15:32:57 UTC 2020


On Monday, 20 July 2020 at 22:05:35 UTC, WhatMeWorry wrote:
> 1) The D Language Reference says:
>
> "There are four kinds of arrays..." with the first example being
> "type*	Pointers to data"  and "int* p;  etc.
>
> At the risk of sounding overly nitpicky, isn't a pointer to an 
> integer simply a pointer to an integer?  How does that pertain 
> to an array?

I agree. "type*" being an array makes no sense from a D language 
point of view.

> 2) "The total size of a static array cannot exceed 16Mb" What 
> limits this? And with modern systems of 16GB and 32GB, isn't 
> 16Mb excessively small?   (an aside: shouldn't that be 16MB in 
> the reference instead of 16Mb? that is, Doesn't b = bits and B 
> = bytes)

This doesn't make sense either. Where did you find this in the 
documentation? It should be removed, as it is easily proven to 
work (`ubyte[170_000_000] s; void main(){s[160_000_000] = 1;}`).

> 3) Lastly, In the following code snippet, is arrayA and arrayB 
> both allocated on the stack? And how does their scopes and/or 
> lifetimes differ?
>
> ==== module1 =====
> int[100] arrayA;
> void foo() // changed from main to foo for clarity
> {
>     int[100] arrayB;
>     // ...
> }
> ==== module1 =====

"The stack" is not a D language thing, a better way of looking at 
it is that local storage is implemented by all D compilers by 
using the "stack" (on x86).

arrayA is not allocated on the stack, lifetime is whole duration 
of program, one array per thread.
arrayB is indeed allocated on the stack (local storage), lifetime 
is only from start to end of foo(), one array per call to foo (!).

Because arrayB is on the stack, you are limited by stack size 
which is set by the OS (but can be overridden). The array would 
be competing with all other things that are put on the stack, 
such as function call return addresses and temporary values, both 
of which you as coder cannot see. What maximum size of arrayB you 
can get away with heavily depends on the rest of your program 
(and the stack size allocated by the OS, which is somewhere in 
the 4MB, 8MB, 16MB range), thus best to avoid putting large 
arrays on the stack alltogether.
arrayA is allocated together with other global/TLS variables in a 
section for which I don't think there really is a size limit.

-Johan


More information about the Digitalmars-d-learn mailing list