C++类的内部结构

本文内容来源:《C++必知必会》

有些编译器将虚函数表的指针置于对象的开头,有些则置于对象的末尾,如果涉及多重继承,若干个虚函数表指针就可能会散布于对象之中。

即使类没有声明虚函数,其中还是有可能被插入一个虚函数表指针。事实上,不管类的数据成员的声明顺序如何,编译器都被允许(有节制地)重新安排它们的布局。

如果一个类类型像一个C 结构体一样非常重要,就可以定义一个POD(plain old data)。内建的类型,比如int, double等都是POD,而且 C struct和类似union的声明也都是POD。

1 struct S{ // 一个POD struct
2 int a;
3 double b;
4 };

如果计划对POD进行低层的处理,那么,在对代码进行维护的过程中,始终保持其为POD很重要,否则所有的赌注将会输得精光:

1 struct S{ //不再是一个POD struct
2 int a;
3 double b;
4 private:
5 std:string c;// 进行了一些维护
6 };

应该在高层操纵类对象,而不应该将它当成一组位的集合。如果希望复制一个类对象,那么永远不要使用memcpy这样的标准内存拷贝函数。

对象的构造函数是编译器建立隐藏机制的地方,该隐藏机制实现对象的虚函数以及诸如此类的东西。

有些聪明过头的代码要么假定虚函数表指针位于零偏移处,要么假设第一个声明的数据成员位于零偏移处。在半数以上的场合下,这两个假定都是不正确的。

posted on 2011-05-24 10:43  Joshua Leung  阅读(679)  评论(0编辑  收藏  举报

导航