[Rd] Why does an empty vector occupy 40 bytes?

Simon Urbanek simon.urbanek at r-project.org
Thu Aug 29 21:35:33 CEST 2013


On Aug 29, 2013, at 3:26 PM, Hadley Wickham wrote:

>>> Do pointers always have to be aligned?
>> 
>> Depends on the architecture, e.g., Sparc doesn't allow non-aligned pointers at all (results in a segfault), SV x86_64 ABI specifies pointers to be aligned at 8 bytes, but the x86_64 CPUs will allow misaligned pointers with a performance penalty (the same was true for x86 - i.e. misaligned pointers are tolerated with a penalty).
> 
> Ok, so you might not have to align pointers a particular architecture,
> but if you're writing code that you want to work across multiple
> architectures you must.
> 

Yes. In many cases the compiler does that for you (e.g. inside structs), but if you are constructing binary objects that will be loaded into memory directly and then accessed then, yes, you have to take that into account. Note that the alignment requirements are not just for pointers but for all types, e.g., Sparc also segfaults if you don't align doubles on 8-byte boundary.

It is also a good idea to have alignment in mind when designing structs, e.g.:

struct a {
    char flag;
    char *name;
    char active;
    char *description;
    int  len;
};

takes 40 bytes on 64-bit machine, while just re-ordering the members to

struct b {
    char *name;
    char *description;
    char flag;
    char active;
    int  len;
};

takes 24 bytes.

Cheers,
Simon


> Hadley
> 
> -- 
> Chief Scientist, RStudio
> http://had.co.nz/
> 
> 



More information about the R-devel mailing list