0%

以STL运用的角度而言,空间配置器总是隐藏在一切组件的背后,但就STL 的实现角度而言,我们需要了解空间配置器,因为整个STL 的操作对象(所有数值,“value”语意)都存放在容器之内,而容器一定需要配置空间以置放数据。

一般而言,我们所习惯的C++ 内存配置操作和释放操作是这样的

1
2
3
class Foo { ... };
Foo* pObj = new Foo;
delete pObj;

其中new 运算包含两阶段操作:1. 调用 ::operator new 配置内存,2. 调用构造函数 Foo() 构造对象。 delete 运算也包含两个阶段:1. 调用析构函数 ~Foo() 将对象析构, 2. 调用 ::operator delete 释放内存。

STL 为了提高效率则把二者分开,对象的构造和析构由::construct() 和::destory() 完成,内存的配置则是由 std::alloc 完成。
先介绍构造和析构基本工具:construct() 和 destroy() 下载源码:http://www.sgi.com/tech/stl/download.html

阅读全文 »

C++和C99均支持内联函数inline,按这个名称的意思应该是“在字里行间展开”,内联函数会在它被调用的位置展开 。

讨论之前,我们先来看一个故事:实验室搬至六楼,小件器件特别多,一同学正一件一件地往六楼搬,老师借给他一个大袋子,这同学一次就把这些小物件搬上了六楼,虽然增加了一个大袋子的重量,却省去了上下六楼100多趟之苦。这个大袋子就充当了内联函数的功能。

我们都知道,一个函数的调用要付出时间上的代价,其大致过程为:

阅读全文 »

单例模式(singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

如何保证一个类只有一个实例并且这个实例易于被访问呢?一个全局变量使得一个对象可以被访问,但它不能防止你实例化多个对象。一个更好的办法是,让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问该实例的方法,这就是 Singleton 模式。

Singleton 类UML图

img

Singleton 类,定义一个 GetInstance 操作,允许客户访问它的唯一实例。GetInstance 是一个静态方法,主要负责创建自己的唯一实例。

Singleton 模式使得这个唯一实例是类的一般实例,但该类被写成只有一个实例能被创建。做到这一点的一个常用方法是将创建这个实例的操作隐藏在一个类操作(即一个静态成员函数或者一个类方法)后面,由它保证只有一个实例被创建。这个操作可以访问保存唯一实例的变量,而且它可以保证这个变量在返回值之前用这个唯一实例初始化。

懒汉模式:单例模式处理方式要在第一次被引用时,才会将自己实例化,其返回值直到被第一次访问时才创建和保存。

阅读全文 »

1、定义申明最重要的区别:定义创建了对象并为这个对象分配了内存,声明没有分配内存。

即一个需要建立存储空间,如 int i; 这是定义;而 extern int i; 是声明,并没有建立存储空间,只是告诉编译器该变量已经在别处定义过了。对于函数的定义和声明也同样如此,这就为什么内联 inline 函数只能在放在函数定义的前面,而不能放在声明之前。

2、在 union 中所有的数据成员共用一个空间,同一时间只能存储其中一个数据成员,所有的数据成员具有相同的起始地址。可以根据这一特性来测试电脑存储模式(大端OR小端),参见代码:

阅读全文 »

对于const,最为熟悉的就是,它允许你指定一个语义约束,也就是指定一个不该被改动的对象,而编译器会强制实施这项约束。const 修饰的值是只读的变量,而不是常量,其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。下面程序说明

1
2
3
4
5
6
7
8
9
// .c file , c project
#include <stdio.h>
const int Size = 100;

int main()
{
int arr[Size]; //编译出错
return 0;
}

C语言中,编译出错,表明 const 修饰的值不是常量(C语言)。但在C++中同样的代码却不会出现编译错误,因为C++扩展了const 的含义,所以C++和C在某些细节上还是有区别的,不过const在C++中更多的是应用在类中,这里主要讨论C++中的const 。

含指针情况下,const 到底修饰谁?先忽略类型名,const 离谁近,就修饰谁。或者,如果关键字 const 出现在 * 左边,表示被指的对象不可改;如果出现在 * 右边,则表示指针自身不可改,如果两边都有,那就是指针和指针所指的对象不可改。

下面就重点探讨C++类中的 const。

阅读全文 »