'new' class method

Yigal Chripun yigal100 at gmail.com
Sat Oct 25 12:50:52 PDT 2008


KennyTM~ wrote:
> Yigal Chripun wrote:
>> KennyTM~ wrote:
>>> Yigal Chripun wrote:
>>>> KennyTM~ wrote:
>>>>> KennyTM~ wrote:
>>>>>> Bill Baxter wrote:
>>>>>>> On Sat, Oct 25, 2008 at 2:04 AM, KennyTM~ <kennytm at gmail.com> wrote:
>>>>>>>
>>>>>>>>>  auto a = Class();  // heap   (default)
>>>>>>>>>  auto a = Struct(); // stack   (default)
>>>>>>>>>
>>>>>>>>>  auto a = Class.new(stack)(); // stack
>>>>>>>>>  auto a = Struct.new(stack)(); // stack
>>>>>>>>>
>>>>>>>>>  auto a = Class.new(heap)(); // heap
>>>>>>>>>  auto a = Struct.new(heap)(); // heap
>>>>>>>>>
>>>>>>>>>   void *addr;
>>>>>>>>>   auto a = Class.new(addr)(); // placement
>>>>>>>>>   auto a = Struct.new(addr)(); // placement
>>>>>>>>>
>>>>>>>> I strongly *oppose* using stack and heap as keywords because there
>>>>>>>> are also
>>>>>>>> (partly irrelevant) data structures called stack and heap, even
>>>>>>>> though
>>>>>>>> according to the guideline these class/structs should be named
>>>>>>>> Stack
>>>>>>>> and
>>>>>>>> Heap.
>>>>>>> Right, that's why both Benji and I proposed making them *context*
>>>>>>> keywords.  Just like "Windows" is a keyword only in the context of
>>>>>>> extern( ).  This would make heap and stack keywords only in the
>>>>>>> context of new(  ).
>>>>>>>
>>>>>> I see. But with the your new(...) syntax this can't be done
>>>>>> because it
>>>>>> is ambiguous with
>>>>>>
>>>>>>   void* stack = allocate();
>>>>>>   auto C = Class.new(stack)();
>>>>>>
>>>>>> The placement new syntax should use some other syntax.
>>>>>>
>>>>> or do it like this:
>>>>>
>>>>>    auto C = Class.new(placement, addr, etc)();
>>>>> //--------------------^ use this to specify it is a placement new.
>>>> maybe just add the concept of allocators.
>>>> auto C1 = Class.new(parameters/*, Allocator = GC.DefaultAllocator */);
>>>> auto C2 = Class.new(parameters, HeapAllocator); // on heap
>>>> auto C3 = Class.new(parameters, StackAllocator); // on stack
>>>> auto C4 = Class.new(parameters, MyPlacementNewAllocator);
>>>> etc..
>>>> initial Allocator hierarchy could be part of the run-time, and could be
>>>> user extended to allow for placement new.
>>>>
>>> This can't work because parameters (I bet you mean constructor arguments
>>> here) can be variadic.
>>
>> I did mean the constructor arguments. The syntax itself is less
>> important here, I was more talking about the concept of Allocators.
>> like the ones in STL, for example.
>>
>> regarding the syntax:
>> a few possibilities that come to mind:
>>
>> a) new!(Allocator)(args)..
> 
> Then Allocator must be known in compile time? Though also in STL.
> 
>>
>> b) Allocator is just a regular parameter which you can add to your args
>> list. now the c-tor need some machinery to handle the allocator.
>> I'd say something like:
>> a c-tor does two things, gets memory and puts stuff into that memory.
>> so the first thing a c-tor does is automatically calls a default
>> Allocator for the type to get memory, *unless* you call one explicitly
>> yourself. it's similar to the way a c-tor has an implicit super() call
>> if you don't call that yourself only this probably will need additional
>> machinery to work.
> 
> Yes. Although the problem right now is syntactical. :(
> 
>>
>> other ideas how to approach this?
>>
> 
> Use the semicolon:
> 
>   Class.new(parameters; allocator params);

if there's an allocator object, you don't need the above. just pass the
extra params to the alloc object itself and not the C-tor.
i.e: Class.new(params, Allocator(params));

extended example:

SharedMemoryAllocator shmAlloc(params);
auto a = ClassA.new(params, shmAlloc);
auto b = ClassB.new(params, shmAlloc);
auto c = StructA.new(params, shmAlloc);
auto d = ClassC.new(params); // default Class Allocator (on heap)
auto e = Struct.new(params); // default Struct Allocator (on stack)
auto d = ClassC.new(params, StackAlloc); // on stack
auto e = Struct.new(params, GCAlloc); // on heap

something like that will require the compiler/runtime to recognize the
allocator interface as special I think...





More information about the Digitalmars-d mailing list