Re: Memory layout and inheritance
On Feb 28, 11:38 pm, "Mathias Gaunard" <loufo...@gmail.com> wrote:
Why, in the following code, is sizeof(Foo) different from sizeof(B) ?
The real question is why you expect them to be the same.
(only tested with GCC on x86) Is there a restriction in the
language preventing this from being the case ?
The language makes only very limited guarantees with regards to
the layout of PODs, and even less for non-PODs. There are
almost no restrictions; it's up to the compiler.
#include <iostream>
struct Foo
{
int a;
bool i;
bool b;
};
Just a guess: on a 32 bit machine (x86), sizeof(Foo) is 8.
There's no guarantee of this, of course, and on an x86, it could
also be 6 and the code would work. (That's not the case on
other processors, of course; if Foo had a size of 6 on a Sparc,
accessing Foo::a on the second element in an array would cause a
core dump.)
struct A
{
int a;
bool i;
};
sizeof(A) is probably also 8. Alignment oblige.
struct B : public A
{
bool b;
};
Off hand, I'd expect 12: an A (of 8 bytes) followed by a bool,
and enough padding to ensure alignment. But other arrangements
are possible. (The empty base class optimization doesn't apply,
since A is not empty. And I'm not sure that the compiler is
allowed to reduce the size of the A sub-object otherwise.)
About the only case I'd expect B and Foo to have the same size
is if the compiler ignored alignment restrictions. While this
is allowed by the x86 architecture, it has significant run-time
cost, and of course, many other architectures don't allow it at
all---ignore alignment on a Sparc, and you get a core dump.
(There is one other case where B and Foo might have the same
size: on a machine where bool was the same size as int. Either
an embedded processor, where sizeof(int)==1, or a word addressed
machine, where the implementor decided to put bool on a word,
rather that a byte, on the grounds that byte access was
significantly slower.)
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient?e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S?mard, 78210 St.-Cyr-l'?cole, France, +33 (0)1 30 23 00 34
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]