Idea: "Explicit" Data Types

Craig Black craigblack2 at cox.net
Wed Apr 2 17:26:15 PDT 2008


"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 




More information about the Digitalmars-d mailing list