For core classes like these we should COMPILE_ASSERT their size. We do this for many, but not all of these classes.
On Thu, Mar 29, 2012 at 1:21 AM, Ryosuke Niwa <rn...@webkit.org> wrote: > Hi, > > Unlike gcc and clang, MSVC pads each consecutive member variables of the > same type in bitfields. e.g. if you have: > struct AB { > unsigned m_1 : 31; > bool m_2 : 1; > } > then MSVC pads m_1 and allocates sizeof(unsigned) * 2 for AB whereas gcc and > clang only allocate sizeof(unsigned) * 1 for AB. > > This is not a compiler bug. It's a spec. compliant behavior, and may in fact > have a better run-time performance in some situations. However, for core > objects like RenderObject and InlineBox, allocating extra 4-8 bytes per each > object is prohibitory expensive. > > In such cases, please use the same POD type for all bitfield member > variables. (Storage class classifiers and variable qualifiers seem to have > no effect on how variables are packed; e.g. mutable, const, etc...). For > example, MSVC will allocate sizeof(unsigned) * 1 for AB if we rewrite the > above code as: > struct AB { > unsigned m_1 : 31; > unsigned m_2 : 1; > } > > When you're making this change, be sure to audit all code that assigns a > non-boolean value to m_2 because implicit type coercion into boolean is no > longer in effect. For example, > > AB ab; > ab.m_2 = 2; > puts(ab.m_2 ? "true" : "false"); > > will print "true" before the change and will print "false" after the change. > An easy way to ensure you've audited all such code is to add getters and > setters for all bitfield member variables or wrap them in a special > structure or class as done > in http://trac.webkit.org/changeset/103353 and http://trac.webkit.org/changeset/104254. > > Best regards, > Ryosuke Niwa > Software Engineer > Google Inc. > > > > _______________________________________________ > webkit-dev mailing list > webkit-dev@lists.webkit.org > http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev > _______________________________________________ webkit-dev mailing list webkit-dev@lists.webkit.org http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev