C++必知必会之(11)编译器会在类中放东西

1、对于一个类而言,并非总是“所见即所得”。

如果一个类声明了一个或多个虚函数,那么编译器将会为该类的每一个对象插入一个指向虚函数表的指针(标准并未保证移动会如此,但所有现有的C++编译器都采用这种方式来实现虚函数机制)。


大多数程序员会假定不同平台之间的虚函数表指针的位置是相同的,因此编写依赖于这种假定的代码。

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


如果使用了虚拟继承,对象将会通过嵌入的指针、嵌入的偏移或其他非嵌入的信息来保持对其虚基类子对象位置的跟踪。因此,即便类没有声明虚函数,其中还是有可能被插入了一个虚函数表指针!

(不管类的数据成员的声明顺序如何,编译器都被允许(有节制地)重新安排它们的布局)。


可以定义一个POD(朴素的旧式数据)来确保一个类类型想一个C struct重要。

内建的类型,比如int、double或者C struct和union都是POD。

struct S   //a POD

{  

    int a;

    double b;

};


2、如果希望复制一个类对象,那么永远都不要使用memcpy这样的标准内存块复制函数(或手工编写的等价代码),

因为这种函数是用来复制存储区,而不是用来复制对象的。


相反,应该使用对象的初始化或赋值操作。对象的构造函数是编译器建立隐藏机制的地方,该隐藏机制实现对象的虚函数以及诸如此类的东西。


将一个对象复制给另一个对象时,必须小心不要覆盖这些内部类的机制。

例如,赋值操作永远不应该改变对象的虚函数表指针的值,它们由构造函数设置,并且在对象整个生命期内保持不变。简单的“比特冲击”可能还会破坏脆弱的内部结构。


另一个常见的问题是假定一个类的特定成员位于对象中给定的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、下载须知 .........................本书用于传播和交流思想 .........................无目录 .........................已经进行解密处理,大多数PDF进行密以至于无法编辑 .........................标清/高清(有颗粒感,但内容清晰) .........................可直接复制粘贴源码 .........................可搜索某一段内容 .........................本版本与网上其他资源不同之处在于,此版本可进行编辑,搜索,已进行内容识别扫描。可全选,可编辑,可剪切文字。 二、全部章节目录如下所示 目录 条款1 数据抽象,................... ,, ..........................、......., ..................................... 1 条款2 多态··········•• .. ···············........................................................................ 2 条款3 设计模式..雁.............................................................................. 漏.........漏圃.5 条款4 STL ....』.................................................................................................8 条款5 弓1 用是别名而斗乍指针............... ,, ......................................................... 10 条款6 数组形参++..................~.....必................................................................. 13 条款7 常量指针与指向常量的指针....................................伽........................... 16 条款8 指向指针的指针.......................................... 千.................薹.................. 矿.19 条款9 新式转型橾作符.........、....................................................................... 21 条款10 常量成员函数的含义........................................................................ 25 条款11 编译器中放东西........................................胪............................ 29 条款12 赋值和初始化并不相同..................................................................... 31 条款13 复制操作· ·.. · · · ·.. · ·.............................................................................. 34 条款14 函数指针..............司·· • · ·•. · · ·.. · · · ·...............•..•.....................••... , ••...•••..... 37 条款15 指向成员的指针井非指针........................ …............. …........ 攀... 零......40 条款16 指向成员函数的指针井非指针……星.....………..................... …............. 43 条款17 处理函数和数组声明.................................................... 卢................... 46 条款18 函数对象·· ·.•. · · ·.. · · · · ·.. · · ·.. · · · ·.. · · · ·.. , ~. ·..................................•................ 48 条款19 Command 模式与好莱坞法则...........................圃..... 伽·························52 2 目录 条款20 STL 函数对象................................................................................... 55 条款21 重载与重写井不相同........................................................................ 58 条款22 Template Method 模式...................................................................... 60 条款23 名字空间··························•················............................................... 62 条款24 成员函数查找................................................................................... 66 条款25 实参相依的查找................................................................................ 68 条款26 操作符函数查找.....................................伽· 喊........................................ 70 条款27 能力查询·······································"·····.. ····"····"''''''"'·····"'''···· 可可..... 72 条款28 指针比较的含义·········"••······················································· 可呵.......... 75 条款29 虚构造函数与Prototype 模式………….... …·…..... ….. ……..... ……... …… .77 条款30 Factory Method模式......................................................................... 79 条款31 协变返回型..................................................、.............................呵.. 82 条款32 禁止复制.................. 哩....................................................................... 85 条款33 制造抽象基..........................乓...........可............................................ 86 条款34 禁止或强制使用堆分配..................................................................... 88 条款35 placement new ................................................................................. 90 条款36 特定干的内存管理·············································........................... 93 条款37 数组分配.......................................................................................... 97 条款38 异常安全公理.......重......................................................................... 100 条款39 异常安全的函数.................…..... 俨..................................................... 103 条款40 RAIi ................................................................. 重.............................. 106 条款41 new 、构造函数和异常................................................... 警.............. 110 条款42 智能指针·····························.................................................. 呵........ 112 条款43 auto_p 七r 非同寻常...................................................................... 114 条款44 指针算术··················...................................................................... 116 目录3 条款45 模板术语....................咱................................ , ..... , ............................ 119 条款46 模板显式特化.一...... 呵......................... 詈······"····"•"·"·•--·""··"·"""'•• 121 条款47 模板局部特化.............. 一一一.....................气.......................................... 125 条款48 模板成员特化..............................................................漏...薰........... 129 条款49 采用typename 消除歧义······························································132 条款50 成员模板..............................书.....................响................................... 136 条款51 采用template 消除歧义...................呵...........................恤.............. 140 条款52 针对型信息的特化鸟...........................................量........................ 142 条款53 嵌入的型信息·······"·····················................................................ 146 条款54 traits ......................... 呵.................................. 量.................................. 149 条款55 模板的模板参数.............................................................................. 154 条款56 policy .............................................................................................. 159 条款57 模板实参推导····································•············································163 条款58 重载函数模板·················································································167 条款59 SFINAE .......................................................................................... 169 条款60 泛型算法..............................................`.....屙···································172 条款61 只实例化要用的东西...................................................................... 176 条款62 包含哨位············................................................................... 响........ 179 条款63 可选的关键字...........................气........................ , ............................ 181 参考文献....................................................................................................... 184 索弓I .............................................................................................................. 185 代码示例索弓1 •••••• , ......................................................................................... 195

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值