Initialisation of static immutable arrays

Steven Schveighoffer schveiguy at yahoo.com
Wed Oct 6 04:39:48 PDT 2010


On Wed, 06 Oct 2010 06:16:45 -0400, Lars T. Kyllingstad  
<public at kyllingen.nospamnet> wrote:

> I have a program that uses an immutable array, the contents of which are
> known at compile time.  Thus, ideally, I want it to be placed in
> the .rodata segment of the program.
>
> Firstly, I seem to remember reading that using an array literal in D will
> always result in a heap allocation.  Is this correct?

Yes.  There is no way to create an immutable array besides a string in  
read only memory.  Even enums will result in array literals being created  
on the heap whenever you refer to them (there's a bug related to this  
somewhere).

> Secondly, if the above is not true, how can I verify that the array in
> the following piece of code isn't allocated and/or copied anew every time
> the program runs, or even worse, every time foo() is called?
>
>   void foo()
>   {
>       static immutable int[3] = [1, 2, 3];
>   }

Actually, static probably will prevent it from being created every time  
foo is called.  I don't think there's a way to prevent it from being  
created every time the program is run.

> I know, RTFAsm, but some help with that would be appreciated. ;)
>
> Thirdly, intuition tells me that when the array is immutable, the
> 'static' shouldn't have an effect.  But experiments (i.e. printing the
> adress of the array) indicate that it does.  Is there some reason for
> this, or is it just a shortcoming of the compiler?

Of course.  If you realize that the expression [1,2,3] is not immutable,  
then it makes sense.

Another example to help you think about it:

void foo(int x)
{
    immutable int[3] = [1,2,x];
}

This must be run on every call of foo, because x can vary.

BTW, I'm all for making array literals immutable.  You can always make  
runtime-allocated arrays via a library function.

-Steve


More information about the Digitalmars-d-learn mailing list