Idea: "Explicit" Data Types

Bill Baxter dnewsgroup at billbaxter.com
Wed Apr 2 17:40:15 PDT 2008


Craig Black wrote:
> 
> "janderson" <askme at me.com> wrote in message 
> news:fsundp$17pd$1 at digitalmars.com...
>> Craig Black wrote:
>>> Before I get into my proposal, I want to vote for stack maps to be 
>>> added to D.  IMO, stack maps are the next logical step to making the 
>>> GC faster. They don't require a fundamental shift in the library like 
>>> a moving GC would. Once stack maps are added, then perhaps the 
>>> following proposal should be considered to glean additional GC 
>>> performance.
>>>
>>> I'm not stuck on terminology here, so if you don't like the term 
>>> "explicit" because it's too overloaded, that's fine with me.  Pick 
>>> another term.  The concept is what's important.  This proposal is 
>>> about getting GC and explicit memory management to play well 
>>> together.  The idea is to give the compiler information that allows 
>>> the GC to scan less data, and hence perform better. Let's start with 
>>> a class that uses explcit memory management.
>>>
>>> class Foo
>>> {
>>> public:
>>>    new(size_t sz) { return std.c.stdlib.malloc(sz); }
>>>    delete(void* p) { std.c.stdlib.free(p); }
>>> }
>>>
>>> This works fine, but doesn't tell the compiler whether data 
>>> referenced by Foo is allocated on the GC heap or not.  If we preceded 
>>> the class with some kind of qualifier, like "explicit", this would 
>>> indicate to the compiler that data referenced by Foo is not allocated 
>>> on the heap.  Note: this constraint can't be enforced by the 
>>> compiler, but could be enforced via run-time debug assertions.
>>>
>>> explicit class Foo
>>> {
>>> public:
>>>    new(size_t sz) { return std.c.stdlib.malloc(sz); }
>>>    delete(void* p) { std.c.stdlib.free(p); }
>>> }
>>>
>>> A problem here arises because even though Foo is allocated on the 
>>> malloc heap, it could contain references, pointers, or arrays that 
>>> touch the GC heap.  Thus, making Foo "explicit" also denotes that any 
>>> reference, pointer or array contained by Foo is also explicit, and 
>>> therefore does not refer to data on the GC heap.  Interestingly, this 
>>> means that "explicit" would have to be transitive, like D's const.
>>>
>>> Thus, for the explicit qualifier to be useful, it must be able to be 
>>> applied to a struct, class, pointer, reference, or array type.  
>>> However, it doesn't make sense to apply it to primitive or POD 
>>> types.  If you follow my logic you understand what explicit types can 
>>> do.  They inform the compiler that no GC heap data will be 
>>> referenced, so that the compiler can exclude explicit types from GC 
>>> scanning.  Further, the use of explicit can be enforced via run-time 
>>> debug assertions.  Note that there are a few implementation details 
>>> that I'm ignoring now for simplicity sake.
>>>
>>> -Craig
>>>
>>
>> I like this idea.
>>
>> ++vote
> 
> I'm waiting for at least three votes before I delve more into the 
> details of the implementation. Seems like everybody's preoccupied with 
> const right now though.
> 
> -Craig

I'm not voting because it sounds like it solves a problem that I don't 
have.  Or else I just haven't understood.  I don't know what stack maps 
are, so you kinda lost me on the first sentence.

--bb



More information about the Digitalmars-d mailing list