Memory allocation purity

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Tue May 20 13:42:43 PDT 2014


On Mon, 19 May 2014 23:14:03 -0400, Jonathan M Davis via Digitalmars-d  
<digitalmars-d at puremagic.com> wrote:

> On Mon, 19 May 2014 13:11:43 -0400
> Steven Schveighoffer via Digitalmars-d <digitalmars-d at puremagic.com>
> wrote:
>
>> On Mon, 19 May 2014 12:35:26 -0400, Jonathan M Davis via
>> Digitalmars-d <digitalmars-d at puremagic.com> wrote:
>>
>> > On Mon, 19 May 2014 09:42:31 -0400
>> > Steven Schveighoffer via Digitalmars-d <digitalmars-d at puremagic.com>
>> > wrote:
>> >
>> >> On Sun, 18 May 2014 09:58:25 -0400, H. S. Teoh via Digitalmars-d
>> >> <digitalmars-d at puremagic.com> wrote:
>> >>
>> >> > On Sat, May 17, 2014 at 11:51:44AM -0700, Jonathan M Davis via
>> >> > Digitalmars-d wrote:
>> >> >> On Thu, 15 May 2014 08:43:11 -0700
>> >> >> Andrei Alexandrescu via Digitalmars-d
>> >> >> <digitalmars-d at puremagic.com> wrote:
>> >> >>
>> >> >> > On 5/15/14, 6:28 AM, Dicebot wrote:
>> >> >> > > This is not true. Because of such code you can't ever
>> >> >> > > automatically memoize strongly pure function results by
>> >> >> > > compiler. A very practical concern.
>> >> >> >
>> >> >> > I think code that doesn't return pointers should be
>> >> >> > memoizable. Playing tricks with pointer comparisons would be
>> >> >> > appropriately penalized. -- Andrei
>> >> >>
>> >> >> Agreed. The fact that a pure function can return newly allocated
>> >> >> memory pretty much kills the idea of being able to memoize pure
>> >> >> functions that return pointers or references, because the
>> >> >> program's behavior would change if it were to memoize the
>> >> >> result and reuse it.
>> >>
>> >> Memoizing reference returns that are immutable should be fine.
>> >
>> > Only if you consider it okay for the behavior of the function to
>> > change upon
>> > memoization - or at least don't consider that the behaviors changed
>> > due to the
>> > fact that the objects are equal but not the same object (which can
>> > matter for
>> > reference types)
>>
>> It shouldn't matter. Something that returns immutable references,
>> can return that same thing again if asked the same way.
>
> Except that a pure function _can't_ return the same object by definition  
> - not
> unless it was passed in via an argument.

Compiles today (2.065):

immutable(Object) alloc() pure
{
     static immutable o = new immutable(Object);
     return o;
}


>>
>> Such a program is incorrectly written.
>
> Well, then Object.toHash is incorrectly written.
>

It might actually be, yes. toHash really should examine the object  
contents, not the address.

-Steve


More information about the Digitalmars-d mailing list