Thread overview
Do strings with enum allocate at usage point?
Mar 17, 2015
岩倉 澪
Mar 17, 2015
Ali Çehreli
Mar 17, 2015
岩倉 澪
Mar 18, 2015
Daniel Kozák
Mar 18, 2015
Marc Schütz
Mar 18, 2015
bearophile
March 17, 2015
I often hear it advised to avoid using enum with arrays because they will allocate at the usage point, but does this also apply to strings?
strings are arrays, so naively it seems that they would, but that seems odd to me.
I would imagine string literals end up in the data segment as they are immutable.

As a continuation of this question, I know that string literals have an implicit null delimiter, so it should be correct to pass a "literal".ptr to a function taking a C-string, and presumably this still applies when using enum.
However, if enum implies allocation at the usage point for strings, one would be better served with static, meaning one would need to be explicit: static foo = "bar\0"?
March 17, 2015
On 03/17/2015 11:21 AM, "岩倉 澪" wrote:
> I often hear it advised to avoid using enum with arrays because they
> will allocate at the usage point, but does this also apply to strings?
> strings are arrays, so naively it seems that they would, but that seems
> odd to me.
> I would imagine string literals end up in the data segment as they are
> immutable.
>
> As a continuation of this question, I know that string literals have an
> implicit null delimiter, so it should be correct to pass a "literal".ptr
> to a function taking a C-string, and presumably this still applies when
> using enum.
> However, if enum implies allocation at the usage point for strings, one
> would be better served with static, meaning one would need to be
> explicit: static foo = "bar\0"?

Strings are fine and fortunately it is very easy to test:

enum arr = [ 1, 2 ];
enum s = "hello";

void main()
{
    assert(arr.ptr !is arr.ptr);
    assert(s.ptr    is s.ptr);
}

Ali

March 17, 2015
On Tuesday, 17 March 2015 at 18:25:00 UTC, Ali Çehreli wrote:
> Strings are fine and fortunately it is very easy to test:
>
> enum arr = [ 1, 2 ];
> enum s = "hello";
>
> void main()
> {
>     assert(arr.ptr !is arr.ptr);
>     assert(s.ptr    is s.ptr);
> }
>
> Ali

Ah, that is good to know. Thanks!
March 18, 2015
On Tue, 17 Mar 2015 11:25:00 -0700
Ali Çehreli via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
wrote:

> On 03/17/2015 11:21 AM, "岩倉 澪" wrote:
> > I often hear it advised to avoid using enum with arrays because they
> > will allocate at the usage point, but does this also apply to
> > strings? strings are arrays, so naively it seems that they would,
> > but that seems odd to me.
> > I would imagine string literals end up in the data segment as they
> > are immutable.
> >
> > As a continuation of this question, I know that string literals
> > have an implicit null delimiter, so it should be correct to pass a
> > "literal".ptr to a function taking a C-string, and presumably this
> > still applies when using enum.
> > However, if enum implies allocation at the usage point for strings,
> > one would be better served with static, meaning one would need to be
> > explicit: static foo = "bar\0"?
> 
> Strings are fine and fortunately it is very easy to test:
> 
> enum arr = [ 1, 2 ];
> enum s = "hello";
> 
> void main()
> {
>      assert(arr.ptr !is arr.ptr);
>      assert(s.ptr    is s.ptr);
> }
> 
> Ali
> 

But is it document somewhere by spec? Or it is just an optimalization which could be remove at some point?

March 18, 2015
On Wednesday, 18 March 2015 at 07:58:58 UTC, Daniel Kozák wrote:
> But is it document somewhere by spec? Or it is just an optimalization
> which could be remove at some point?

I cannot find it in the specification, but it is guaranteed. It's a benefit we get from the immutability of strings. AFAIK the compiler will even merge identical string literals, even when they appear in different modules.
March 18, 2015
岩倉 澪:

> However, if enum implies allocation at the usage point for strings,

There are two ways to see if something allocates: there is a compiler switch, and an annotation:

void foo() @nogc {
    // Your code here
}

If the compiler doesn't have a bug it will complain if you put something that allocates inside that function.

Bye,
bearophile