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, rip...@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
______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel