Possible way to achieve lazy loading with const objects

Steven Schveighoffer schveiguy at yahoo.com
Thu Sep 29 04:36:36 PDT 2011


On Wed, 28 Sep 2011 17:09:59 -0400, Jonathan M Davis <jmdavisProg at gmx.com>  
wrote:

> On Wednesday, September 28, 2011 13:56 Steven Schveighoffer wrote:
>> On Wed, 28 Sep 2011 16:03:51 -0400, Jonathan M Davis  
>> <jmdavisProg at gmx.com>
>>
>> wrote:
>> > On Wednesday, September 28, 2011 11:31:31 Christophe wrote:
>> >> "Jonathan M Davis" , dans le message (digitalmars.D:145479), a écrit  
>> :
>> >> > But since lazy initializion will _never_ work with immutable
>> >>
>> >> Never say never. One could build a clean and thread-safe way to  
>> lazily
>> >> initialize fields. Like someone said, even without mutex, if the
>> >> function to compute the variable is pure and based on immutable data,
>> >> the worst case would be to run the intializing function twice. And  
>> the
>> >> langage could include mutexes to do prevent that to happen. The fact
>> >> that immutable data could, one day, be put in ROM doesn't mean that  
>> it
>> >> has to. The close issue is like another-one said the issue of
>> >> memoization of pure methods.
>> >
>> > The very fact that an immutable variable _could_ be put into ROM  
>> negates
>> > the
>> > possibility of the semantics being such that you don't have to fully
>> > initialize an immutable variable up front.
>>
>> No it doesn't. If it's in ROM, initialize eagerly (which should cost
>> nothing, done at compile-time). If it's not, initialize lazily.
>
> That's assuming that objects can only ever be put into ROM at compile  
> time. Is
> such an assumption valid? And not just currently valid, but permanently  
> valid?

By definition ROM is read only.  How can it be created during runtime if  
it's read-only?  And if it's some hardware-based ROM, what makes it  
read/write during the constructor?

>
> Though I suppose that even if that assumption isn't valid, the compiler  
> should
> still know when it's putting something in ROM and force eager loading it  
> that
> case.
>
> However, that does introduce the whole locking issue again, since  
> immutable
> variables are implicitly shared.

Locking issues are not present when all the data is immutable.  It's why  
immutable is implicitly shared.

-Steve


More information about the Digitalmars-d mailing list