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这样的标准内存拷贝函数。

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

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

转载于:https://www.cnblogs.com/cmleung/archive/2011/05/24/2055128.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值