Malloc vs new — different padding

IIRC there’s one picky point. malloc is guaranteed to return an address aligned for any standard type. ::operator new(n) is only guaranteed to return an address aligned for any standard type no larger than n, and if T isn’t a character type then new T[n] is only required to return an address aligned for T.

But this is only relevant when you’re playing implementation-specific tricks like using the bottom few bits of a pointer to store flags, or otherwise relying on the address to have more alignment than it strictly needs.

It doesn’t affect padding within the object, which necessarily has exactly the same layout regardless of how you allocated the memory it occupies. So it’s hard to see how the difference could result in errors transferring data.

Is there any sign what the author of that comment thinks about objects on the stack or in globals, whether in his opinion they’re “padded like malloc” or “padded like new”? That might give clues to where the idea came from.

Maybe he’s confused, but maybe the code he’s talking about is more than a straight difference between malloc(sizeof(Foo) * n) vs new Foo[n]. Maybe it’s more like:

malloc((sizeof(int) + sizeof(char)) * n);

vs.

struct Foo { int a; char b; }
new Foo[n];

That is, maybe he’s saying “I use malloc”, but means “I manually pack the data into unaligned locations instead of using a struct”. Actually malloc is not needed in order to manually pack the struct, but failing to realize that is a lesser degree of confusion. It is necessary to define the data layout sent over the wire. Different implementations will pad the data differently when the struct is used.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)