Ok, so that's a bug then. On x64, one should add 8 bytes of padding before (or 
after) the counter in front of any NSObject to preserve a clean alignment. 

Thanks Thomas.

--
  Laurent

On Jul 5, 2013, at 9:39 AM, Thomas Gamper <[email protected]> wrote:

> Hi!
> 
> I think that is caused by the implicit padding caused by the reference 
> counter inside each NSObject. Basically memory is allocated for the reference 
> counter + object size, but the reference counter is located at the start of 
> the allocated memory chunk, so you get a pointer offset by the amount of 
> bytes the reference counter needs. malloc returns a 16 byte aligned address, 
> the first few bytes of the chunk are needed for the reference counter which 
> has the size of an unsigned long, meaning 8 byte on Linux/AMD64, so you end 
> up with a pointer pointing to the memory after the reference counter, which 
> is the 16 byte aligned address + 8 bytes.
> 
> Cheers,
> TOM
> 
> On 2013-07-05 15:09, Laurent Michel wrote:
>> Good morning!
>> 
>> I have ported an application to GNUstep (from MacOS) and everything works 
>> very well on a ubuntu 12.04 LTS (32-bit). 
>> 
>> However, the same port fails under 12.04 LTS (64-bit) for a simple reason:
>> 
>> On GNUstep the NSAllocateObject function (and therefore all the alloc 
>> methods) do _not_ return 
>> 16 bytes aligned objects. On Linux, the objects are always 8 bytes aligned. 
>> I checked, and my code on Cocoa (MacOS 10.8.4) [the same call to 
>> NSAllocateObject] returns 16 bytes aligned objects.
>> 
>> Either this is a bug, or I'm missing a macro/define somewhere to tell 
>> GNUstep I'd like to have 16 bytes aligned objects. 
>> 
>> Naturally, I can redefine a new method for the meta-class whose instances 
>> require a 16 byte alignment, but this is ad-hoc and would be required for 
>> every object susceptible of storing a structure expecting 16 bytes 
>> alignments. 
>> 
>> Note that the structure whose field require a 16 byte alignment and which is 
>> hosted in instances of that specific class is correctly tagged with a clang 
>> attribute to require that the structure start address be correctly aligned. 
>> Of course, that _assumes_ that the object itself is 16 bytes aligned which 
>> is not the case here. 
>> 
>> Is there a suitable incantation to get a 16-byte alignment on Linux64 ?  Do 
>> you agree that this is a bug ? 
>> 
>> Thanks for your help,
>> 
>> All the best,
>> 
>> 
>> --
>>   Laurent
>> 
>> 
>> 
>> _______________________________________________
>> Gnustep-dev mailing list
>> [email protected]
>> https://lists.gnu.org/mailman/listinfo/gnustep-dev
> 
> _______________________________________________
> Gnustep-dev mailing list
> [email protected]
> https://lists.gnu.org/mailman/listinfo/gnustep-dev

_______________________________________________
Gnustep-dev mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to