asm, c, c++ are my all
-- Core In Computer
posts - 139,  comments - 123,  trackbacks - 0

|    欢迎转载, 但请保留作者姓名和原文链接, 祝您进步并共勉!     |

C++对象模型(8) - Chapter 3. The Semantics of Data

作者: Jerry Cat
时间: 2006/11/15

;Chapter 3. The Semantics of Data
Chapter 3. The Semantics of Data - 空类不空

class X {};
class Y : public virtual X {};
class Z : public virtual X {};
class A : public Y, public Z {};
None of these classes contains any explicit data—any anything, in fact, except an inheritance
relationship—so he apparently believed the size of each class should be 0. It wasn't,
of course—not even the apparently benign class X:

sizeof X yielded 1
sizeof Y yielded 8
sizeof Z yielded 8
sizeof A yielded 12
Let's look at each declaration in turn and see what's going on. An empty class, such as

// sizeof X == 1
class X {};
in practice is never empty. Rather it has an associated size of 1 byte—a char member inserted
by the compiler. This allows two objects of the class, such as

X a, b;
if ( &a == &b ) cerr << "yipes!" << endl;//to be allocated unique addresses in memory.哈!

// sizeof Y == sizeof Z == 8
class Y : public virtual X{};
class Z : public virtual X{};
On his machine, the size of both classes Y and Z is 8. This size, however, is partially machine dependent. It also depends in part on the compiler implementation being used. The given size of both class Y and class Z on any machine is the interplay of three factors:

(1). Language support overhead. There is an associated overhead incurred in the language support of virtual base classes. Within the derived class, this overhead is reflected as some form of pointer, either to the virtual base class subobject or to an associated table within which either the address or offset to the virtual base class subobject is stored. On my correspondent's machine, the pointer is 4 bytes. (Virtual base classes are discussed in Section 3.4.)

(2). Compiler optimization of recognized special cases. There is the 1 byte size of the virtual base class X subobject also present within Y (and Z). Traditionally, this is placed at the end of the "fixed" (that is, invariant) portion of the derived class. Some compilers now provide special support for an empty virtual base class (the paragraph following item 3 discusses this in more detail). Our correspondent's compiler, however, did not provide this special handling.

(3). Alignment constraints. The size of class Y (and Z) at this point is 5 bytes. On most machines, aggregate structures have an alignment constraint so that they can be efficiently loaded from and stored to memory. On my correspondent's machine, alignment of an aggregate is on a 4-byte boundary. So class Y (and Z) requires 3 bytes of padding. The result is a final size of 8.

The C++ object model representation for nonstatic data members optimizes for space and access time (and to preserve compatibility with the C language layout of the C struct) by storing the members directly within each class object. This is also true for the inherited nonstatic data members of both virtual and nonvirtual base classes, although the ordering of their layout is left undefined. Static data members are maintained within the global data segment of the program and do not affect the size of individual class objects.(静态数据成员被放在全局数据段, 并不影响单个类的大小)
Only one instance of a static data member of a class exists within a program regardless of the number of times that class is an object of direct or indirect derivation. (The static data members of a template class behave slightly differently. See Section 7.1 for a discussion.)模板类的静态数据成语有所不同

(1). Additional data members added by the compilation system to support some language functionality (primarily the virtuals)

(2). Alignment requirements on the data members and data structures as a whole

posted on 2006-11-15 16:55 Jerry Cat 阅读(456) 评论(0)  编辑 收藏 引用

网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理