寒假过完了,回到学校,开始了新的一轮学习。寒假还是像以前那样带回去基本书,作为心理安慰。既然来学校了,就要让安慰变成现实。我给你一个的计划,一个月最少看完一本书。并做适当的总结。计划的第一本书《深入探索C++对象模型》。寒假看了点,就算从2月1日开始的。在二月份要把这本书看完。可以提前,但是不可以拖。
今天上午终于在实验室看了一上午的书,没有开电脑上网。对我来说是个不小的突破(在实验室看不下去书),今天主要看了,第3章:Data 语意学;就在写这篇文章的时候感觉忘差不多了。
一.
class X{};
class Y:public virtual X{};
class Z:public virtual X{};
class A:public Y,public Z{};
1.一个class X内没有含明显的数据,但是sizeof X的结果是1. 事实上并不是空,它有一个隐晦的1 byte,那是被编译器安***去的一个char。这使的这个class的不同objects得以在内存中配置独一无二的地址。
2.Y和Z的大小是8 byte。受到三个因素影响:
(1)语言本身所造成的额外负担(overhead);
(2)编译器对于特殊情况所提供的优化处理;
(3)Alignment的限制。
二.Data Member的绑定(The Binding of a Data Member)
extern float x;
class Point3d
{
public:
Point3d( float ,float,float);
/ /被传回和被设定的x是哪一个x呢,早期的c++编译器,和现在的,分别
float X() const { return x;}
void X(float new_x) const { x = new_x ;}
private:
float x,y,z;
}
1.早期C++的两种防御性程序设计风格:
(1)把所有的data members 放在class声明起头处,以确保正确的绑定。
(2)把所有的inline function,不管大小都放在class声明之外。
因为"一个inline的函数实体,在整个class声明中未被完全看见之前,是不会被评估求值(evaluated)的。"
2.
typedef int length;
class Point3d
{
public:
void mumble(length val) { _val=val ; }
length mumble() { return _val; }
private:
typedef float length;
length _val;
};
//解释这个class中得length;
三.Data Member的布局(Date Member Layout)
1.
class Point3d
{
private:
float x;
static List<Point3d*> *freeLis;
float y;
static const int chunkSize =250;
float z;
}
问题:解释这个class object的布局(排列顺序)