From: Robert Klemme Date: 2005-01-01T03:46:41+09:00 Subject: Re: sizeof(Class)/sizeof(Object) "Charles Mills" schrieb im Newsbeitrag news:1104515965.487836.265250@c13g2000cwb.googlegroups.com... > Nikolai Weibull wrote: >> I would like to figure out how much memory a certain class or object >> will/is consuming. Is there an easy way? Is there a hard way? >> The reason I ask is because I want to keep several hundred thousand >> instances of an object much like the following one: >> >> class A >> def initialize >> @a = @b = @c = @d = nil >> @e = 1 >> end >> end >> > > Instance variables are stored in a hash table associated with each > object. See rb_ivar_set() in variable.c. So basically each instance > will take up the size of struct RObject - which is 20 bytes on a 32bit > machine, plus the size of the hash table (see st.h), plus something > else I am probably missing. As far as I know st.h doesn't provide any > means of calcing the number of bytes used by the hash. > Is there a way to do this? > > Also, objects with no instance variables don't create a hash table to > store instance variables... So if there was only one instance var an optimization could be to store them in a hash in the instance's class. This could work for multiple ivars as well but then there is the array overhead. Hm... class Foo @ivar = {} def initialize cl = self.class ObjectSpace.define_finalizer(self) {|id| cl.remove id} end def bar=(x) self.class.set_val(id, x) end def bar; self.class.get_val(id) end def self.set_val(id, val) @ivar[id] = val end def self.get_val(id) @ivar[id] end def self.remove(id) puts "removing #{id}" @ivar.delete id end end Just some thoughts in code... robert