www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Fixed length vs dynamic arrays

reply Alain De Vos <devosalain ymail.com> writes:
Is a fixed length array created on the heap and a dynamic array 
on the stack ? And is this important with relation to the garbage 
collector ?
May 06
parent reply Paul Backus <snarwin gmail.com> writes:
On Thursday, 6 May 2021 at 22:35:38 UTC, Alain De Vos wrote:
 Is a fixed length array created on the heap and a dynamic array 
 on the stack ? And is this important with relation to the 
 garbage collector ?
Static arrays (`T[N]`) are value types, like structs. If you declare them as local variables, they're allocated on the stack. Dynamic arrays (`T[]`), also known as slices, are reference types, consisting of a pointer and a length. If you declare them as local variables, the pointer and length will be stored on the stack. The data they point to, however, may be stored on either the stack or the heap. For more information about slices in D, I highly recommend this excellent article by Steven Schveighoffer: https://dlang.org/articles/d-array-article.html
May 06
parent reply Alain De Vos <devosalain ymail.com> writes:
Following code compiles without errors, only errors during runtime
```
int main(){
	int[2]  a=new int[2];
	int[]   b=new int[0];
	int[2]  c=[1,2];
	a=a~3;
	b=b~3;
	c=c~3;
	c=b;
	b=a;
	a=c;
return 0;
}
```
May 07
parent Paul Backus <snarwin gmail.com> writes:
On Friday, 7 May 2021 at 22:21:09 UTC, Alain De Vos wrote:
 Following code compiles without errors, only errors during 
 runtime
 ```
 int main(){
 	int[2]  a=new int[2];
 	int[]   b=new int[0];
 	int[2]  c=[1,2];
 	a=a~3;
 	b=b~3;
 	c=c~3;
 	c=b;
 	b=a;
 	a=c;
 return 0;
 }
 ```
The result of a `~` expression is always a newly-allocated dynamic array on the GC heap. [1] When you assign a dynamic array to a static array, the elements from the dynamic array on the right-hand side are copied into the static array on the left-hand side. [2] So the statement a = a ~ 3; ...is essentially shorthand for auto _tmp = a ~ 3; foreach (i; 0 .. _tmp.length) a[i] = _tmp[i]; Because `a` has length `2` and `a ~ 3` has length `3`, this results in a `RangeViolation` at runtime when attempting to copy `_tmp[2]` into `a[2]`. [1] https://dlang.org/spec/expression.html#cat_expressions [2] https://dlang.org/spec/arrays.html#array-copying
May 07