A recent question about string literals in .NET caught my eye. I know that string literals are interned so that different strings with the same value refer to the same object. I also know that a string can be interned at runtime:
string now = DateTime.Now.ToString().Intern();
Obviously a string that is interned at runtime resides on the heap but I had assumed that a literal is placed in the program's data segment (and said so in my answer to said question). However I don't remember seeing this anywhere. I assume this is the case since it's how I would do it and the fact that the ldstr IL instruction is used to get literals and no allocation seems to take place seems to back me up.
To cut a long story short, where do string literals reside? Is it on the heap, the data segment or some-place I haven't thought of?
Edit: If string literals do reside on the heap, when are they allocated?