enforce()?

Steven Schveighoffer schveiguy at yahoo.com
Mon Jul 19 13:09:34 PDT 2010


On Mon, 19 Jul 2010 15:53:46 -0400, bearophile <bearophileHUGS at lycos.com>  
wrote:

> Steven Schveighoffer:
>
>> Not quite :)  There is one byte for padding because (insert  
>> gasp-inspiring
>> music accent) all struct heap allocations are allocated through newArray
>> with a size of 1.  I discovered this when working on the array append
>> patch.
>
> How much more hidden shit like this do I have to see?
> I have filed a bug report:
> http://d.puremagic.com/issues/show_bug.cgi?id=4487
> Maybe Walter has to fix this before porting dmd to 64 bits.
>
>
>> Most of this is mitigated if you have a custom allocator that allocates  
>> an
>> array of nodes at once
>
> The GC is supposed to not suck that much. If I want to do all manually  
> and use custom allocators then maybe it's better if I start to switc to  
> C language.
> Thank you Steven.

What's so horrible about it?  It's a corner case.  If you were allocating  
a 20-byte struct, you are wasting 12 bytes per value anyways.  Or what  
about a 36-byte struct?

All I'm saying is the pad byte itself isn't a huge issue, even if it  
didn't exist, there would always be inefficient allocations.  Take the  
redblack tree node for instance.  Get rid of the pad byte, and it's tuned  
for word-size payload.  But go over that, and you're back to pretty much  
wasting 50% of your memory.  If you want to tune your app to be the most  
efficient at memory allocation, you need to study the allocator and learn  
its tricks and nuances.  I think you have some misguided notion that C's  
allocator is perfect, and there's no hidden cost to it.  That's not the  
case.

That being said, it would be good if we could get rid of the 1-byte pad  
for single struct allocations on the heap.  As a bonus, the code will be  
more efficient because it doesn't have to deal with the "array" notion.

-Steve


More information about the Digitalmars-d mailing list