《深度探索C++对象模型》的原文摘录

  • 在这四种情况中,程序可以被正确编译并执行,但是效率不彰。 (查看原文)
    邻家の躺平人 2013-07-28 22:49:57
    —— 引自第75页
  • You mustuse the member initialization list in the following cases in order for your program to compile 1. When initializing a reference member 2. When initializing a const member 3. When invoking a base or member class constructor with a set of arguments In the fourth case, the program compiles and executes correctly. But it does so inefficiently. (查看原文)
    邻家の躺平人 2013-07-28 22:49:57
    —— 引自第75页
  • 1. b[i] + c[i] 对应一个 2. b[i] * c[i] 对应一个 3. 上述两个临时对象的相减结果需要一个来存放 4. 两个临时对象,分别用来放置上述第一个临时对象和第二个临时对象,为的是完成第三个临时对象 (查看原文)
    邻家の躺平人 2013-09-11 16:07:19
    —— 引自第276页
  • RIIT 就是为了 EH (Exception Handling) 的副产物 (查看原文)
    欣蔚蓝 2018-11-12 16:37:08
    —— 引自第303页
  • 然而如果企图以一个RedPanda object作为little_critter的初值,编译器必须判断“后续当程序员企图存取其ZooAnimal subobject时是否能够正确地执行”(这是一个理性的程序员所期望的) (查看原文)
    夏夜寂寞属壁虎 2021-01-17 17:03:26
    —— 引自第58页
  • foobar()函数中的L5,有个 Point object local,同样也是既没有被构造也没有被析构。当然啦,Point object local如果没有先经过初始化,可能会成为一个潜在的程序“臭虫”——万一第一次使用它就需要其初值的话(像L7)。至于 heap object在L6的初始化操作: 6)Point * heap = new Point; 会被转为对new运算符(由library提供)的调用: Point *heap = __new( sizeof( Point ) ); 再一次强调一下,并没有 default constructor施行于new运算符所传过的Point身上。L7对此object有个指派(赋值,assign)操作,如果 local曾被适当地初始化过,一切就没有问题: (7)*heap = local; 事实上这一行会产生编译警告如下: warning, line 7: local is used before being initialized 观念上,这样的指定操作会触发 trivial copy assignment operator 做拷贝搬运操作。然而实际上该object是个 Plain Ol' Data,所以赋值操作(assignment)将只是像C那样的纯粹位搬移操作。L9执行一个 delete操作: 9)delete heap; 会被转换为对delete运算符(由 library提供)的调用: __delete( heap ); 观念上,这样的操作会触发 Point的 trivial destructor。但一如我们所见, destructor要不是没有被产生就是没有被调用。最后,函数以传值方式将 local当做返回值传回,这在观念上会触发 trivial copy constructor,不过实际上... (查看原文)
    夏夜寂寞属壁虎 2021-01-26 15:14:49