D vs. placement new (for classes) aka why D needs .sizeof and .alignof for classes (values not references)
Forest Ray
disto at flying-guillotine.com
Thu Apr 12 16:10:35 PDT 2007
Before I add this to the bug database I wanted to run this by everyone and see if I'm overlooking something. Classes in D are always a reference. Therefore the .sizeof and .alignof a class (reference) are always (void*).sizeof and (void*).alignof. D allows the class allocator (new) to be overloaded. The number of bytes required to hold the class (value) is passed as the first parameter to new(size_t size). This works well unless you are wanting to perform a placement new. When using placement new you pass in the storage for the object to be placed.
new(size_t size, void* ptr) {
return ptr;
}
The problem is at compile time you can NOT determine the size or alignment of a class (value), only the reference. Therefore you can not know the sizeof the buffer to preallocate to hold the class (value). I believe this to be an oversight in the language design. The alignment issue is easier to overcome, the ABI states the first field of a class (value) is the vbtbl pointer which will always mean the class (value) is (void*).alignof aligned. The .sizeof property for a class (value) is not available, here in lies the problem. Placement new is the easy example where the sizeof the class (value) is needed. Also consider the case of a blocks of class (values) being preallocated for a free list.
More information about the Digitalmars-d
mailing list