类继承的开销 ——《Inside the C++ Object Model》笔记二

归类于编程 参与评论

一、不含多态的继承

即基类里没有虚函数。这时候派生类成员的存取时间并没有增加,但是空间上会有浪费。比如有如下两个类

class X {
	int a;
	char b;
};
class Y : public X {
	char c;
};

一个X对象占用4+1+3(padding, 假设4字节对齐) = 8字节。而一个Y对象并不是占用 4+1+1+2(padding)=8个字节,而是占用4+1+3(padding)+1+3(padding)=12个字节。编译器之所以如此设计,是为了使派生类对象中基类对象的内存结构和原始的基类对象一致,这种一致性保证了通过指针复制对象时不出错。如果按照前一种内存布局,会产生错误,比如:

继续阅读

构造函数 ——《Inside the C++ Object Model》笔记一

归类于编程 参与评论

Inside the C++ Object Model Chapter 2 : The Semantics of Constructor 构造函数语义学

一、默认构造函数 Default Constructor

C++编译器会在Class的每一个构造函数中通过添加代码的方法暗中(implicit)做了下面几件事:

  1. 如果在这个构造函数没有对所有Member Class Object进行构造, 编译器会调用余下没有构造的Member Class Object的默认构造函数;
  2. 如果此构造函数没有提供基类构造函数的参数列表, 编译器会调用基类的默认构造函数;
  3. 如果类中含有虚函数,编译器会利用构造函数产生一张virtual function table(vbtl),并在每个Class Object中添加一个vprt(指向vbtl的指针);
  4. 如果类有Virtual Base Class虚基类,编译器会在构造函数中添加代码, 允许每个虚基类的执行期存取操作。

继续阅读

, ,

Fibonacci数的巧妙求法

归类于编程 2 条评论

看MIT算法导论视频真是收获不蜚,今天学会了求Fibonacci数最快的方法~

Fibonacci(斐波那契)数列小学生都知道的,求Fibonacci数也不是什么难事,可以用递推式一步一步推(线性)。有没有更快的方法呢,你可能马上就想到了通项公式:

这个公式要算一个数的n次方,由于一个数的n次方可以由一个分治算法在logn时间内得到:a

继续阅读

, ,

顶部