Hi all, Why is the object size of an empty vector 40 bytes? (At least in 64-bit R.) object.size(integer(0)) # 40 bytes Reading R internals, it looks like it should be: * 4 bytes: sxpinfo header (= 32 bits) * 8 bytes: pointer to attributes * 8 bytes: pointer to next node * 8 bytes: pointer to previous node * 4 bytes: length * 4 bytes: true length = 36 bytes Where are the extra 4 bytes coming from? What have I missed? I thought it might be for memory alignment, but if it was padded by an additional 4 bytes, then an integer vector of length 1 should be the same size, assuming I've interpreted the comment about "aligned as required" correctly. Thanks! Hadley -- Chief Scientist, RStudio http://had.co.nz/
On Aug 29, 2013, at 9:39 AM, Hadley Wickham wrote:> Hi all, > > Why is the object size of an empty vector 40 bytes? (At least in 64-bit R.) > > object.size(integer(0)) > # 40 bytes > > Reading R internals, it looks like it should be: > > * 4 bytes: sxpinfo header (= 32 bits) > * 8 bytes: pointer to attributes > * 8 bytes: pointer to next node > * 8 bytes: pointer to previous node > * 4 bytes: length > * 4 bytes: true length > > = 36 bytes > > Where are the extra 4 bytes coming from? What have I missed? >Alignment of pointers -- there are 4 bytes of padding on 64-bit machines after sxpinfo> I thought it might be for memory alignment, but if it was padded by an > additional 4 bytes, then an integer vector of length 1 should be the > same size, assuming I've interpreted the comment about "aligned as > required" correctly. > > Thanks! > > Hadley > > -- > Chief Scientist, RStudio > http://had.co.nz/ > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > >
On 29/08/2013 14:39, Hadley Wickham wrote:> Hi all, > > Why is the object size of an empty vector 40 bytes? (At least in 64-bit R.) > > object.size(integer(0)) > # 40 bytes > > Reading R internals, it looks like it should be: > > * 4 bytes: sxpinfo header (= 32 bits) > * 8 bytes: pointer to attributes > * 8 bytes: pointer to next node > * 8 bytes: pointer to previous node > * 4 bytes: length > * 4 bytes: true length > > = 36 bytes > > Where are the extra 4 bytes coming from? What have I missed? > > I thought it might be for memory alignment, but if it was padded by an > additional 4 bytes, then an integer vector of length 1 should be the > same size, assuming I've interpreted the comment about "aligned as > required" correctly.You have not: the start of the vector area also needs to be aligned (since it might hold doubles or CHARSXPs). See memory.c, which says, inter alia /* All vector objects must be a multiple of sizeof(SEXPREC_ALIGN) bytes so that alignment is preserved for all objects */ /* Node Classes. Non-vector nodes are of class zero. Small vector nodes are in classes 1, ..., NUM_SMALL_NODE_CLASSES, and large vector nodes are in class LARGE_NODE_CLASS. For vector nodes the node header is followed in memory by the vector data, offset from the header by SEXPREC_ALIGN. */ And also, object.size() is only approximate, and documented to be so. In fact many short vectors are using larger blocks of memory incompletely, and of course the OS is supplying memory in pages. -- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595