On Wed, 13 Jan 2010 12:16:30 -0500, bearophile <[email protected]> wrote:

Justin Johansson:
So why on earth, since Visual Studio 2001 (and before?), was the default
alignment set to 8 bytes for the M$ C/C++ compiler code generation
option?

Maybe because for compatibility reasons they can't require a 16 bytes alignment (as OS X does, I think) as SSE registers appreciate.


It depends on the architecture/register. On most chips, if you load a register from a segment of memory, that memory has to be n-byte aligned where n is the number of bytes for the register. But there are exceptions. I'm not sure if SSE register requires alignment. Typically on systems that do not support loading from a byte-aligned memory segment will throw a bus error if you try to do it.


Is that true? Is this required by the tag bits added by the GC scans? Does std.c.stdlib.malloc always return aligned to 8 on Windows?<<

And no one has given me such answers yet.
And currently the D GC seems to always return aligned to 16 bytes (even chunks of memory smaller than 16 bytes).

I would guess that pointers on a 32-bit architecture need to be 4-byte aligned, otherwise, a struct like this:

struct S
{
   int *x;
   int *y;
}

would have to be minimum of 16 bytes!

I think the reason the allocator must return 8-byte aligned memory is because the allocator doesn't know what you're going to put in there, so it must handle the worst case scenario (doubles).

BTW, 16 bytes is the minimum size the GC returns, and I think it's a somewhat arbitrary decision. The minimum you could possibly return is 8 bytes, and it becomes a judgement call that depends on other factors if you want to increase the minimum size (less overhead per block vs. more wasted space).

-Steve

Reply via email to