sizeof(object) is different in ANSI and Unicode

From: Sunil Menon (sunil_at_itb-india.com)
Date: 12/01/03


Date: 1 Dec 2003 04:55:58 -0800

Dear All,
   A class having no member variables and only a method sizeof(object)
will return 1byte in ANSI and two bytes in Unicode.
   I have the answer for this of how in works in ANSI. But I don't
know it returns two bytes in UniCode.
Please help...

For ANSI:
In ISO/ANSI C++ Standard, 5.3.3 § 1, it stays: "The sizeof operator
yields the number of bytes in the object representation of its
operand.(...)
the result of sizeof applied to any other fundamental type
(_basic.fundamental_) is implementation-defined."
[Note: in particular, sizeof(bool) and sizeof(wchar_t) are
implementation-defined. ..."sizeof(bool) is not required to be 1."
The value of sizeof(bool) can be anything between 1 and N, where N is
positive integer number (I suppose 0 is not a reasonable value). One
can
read this as "size of bool type can not be smaller than size of char
type, as sizeof(char) is guaranteed to be 1"]
A class having no member variables and only a method sizeof(object)
will return 1byte.
Reason:
The basic issue is addressability. So, as long as memory's smallest
unit is char (sizeof(char)==1 by definition); no addressable object
can use less storage, even if it only uses up a single bit. Member
functions don't add to the sizeof a class.
All objects must have sizeof of at least one. This is so that you can
form a pointer to an empty object that is distinct from a pointer to
another empty object.
Examples:
  Suppose sizeof(char )==1 // always true
  Suppose sizeof(int )==4
  Suppose sizeof(void*)==4 // possibly size of virtual pointer
 
For a class with virtual function, size of a virtual function is a
size of pointer to function.
the common implementation has only one virtual pointer in each object.
 This virtual pointer points to a virtual table. There is one virtual
table for the whole class. Think of the virtual table as static data.
The virtual table has N entries if there are N virtual funcs. Eg,
 
struct Thing
{
   virtual ~Thing();
   virtual void f() const;
   void g();
   virtual void h() const;
   
   int i;
};
 
Assuming sizeof(int)==4 and sizeof(any pointer)==4, then
sizeof(Thing)==sizeof(Thing::vptr)+sizeof(Thing::i)==8.
 
But there is a virtual table containing 3 entries. The compiler
generates this table internally. A class has a virtual table only if
it has a virtual function. For nonvirtual functions, an object doesn't
have to keep reference to it. I think they're just a piece of code
that compiler resolve at compile time.

Thanks & Regards
Sunil



Relevant Pages

  • Re: OOP in C!
    ... > How do I access these 'member variables' from the function ... You must pass a pointer to the function explicitly. ... don't store pointers to functions in the object itself. ... They store a pointer to a virtual function table ...
    (comp.lang.c)
  • Re: Why sizeof(struct) is different in C and C++ ?
    ... >> My conceptual view is a stack of base classes, ... For "ordinary" inheritance where each class inherits from exactly one immediate ... for just a single virtual function table pointer. ...
    (comp.lang.cpp)
  • Re: is it good, is it bad or plain eeevil ?
    ... > This is a virtual function call regardless of how call_vfun was called ... If sword is 'given' to player (that is pointer is passed), ... virtual method. ...
    (comp.lang.cpp)
  • Re: Would a static_cast be better style here?
    ... >> And of course to convert from a derived pointer type to a base pointer ... > pointer, then you are correct, there is no need to cast. ... For a virtual function the scope resolution operator is the only way. ...
    (comp.lang.cpp)
  • Re: memory usage of Virtual function poiters
    ... > That won't compile either. ... I forgot the cast. ... >> percolate through the virtual function table. ... behavior of casting a pointer to a pointer of sibling class. ...
    (alt.comp.lang.learn.c-cpp)