
读书笔记
文章平均质量分 72
万木春《Linux 后端开发工程实践》
这个作者很懒,什么都没留下…
展开
-
memcpy Linux内核实现引发的思考:为什么嵌入式汇编中不用指定段寄存器
memcpy Linux内核实现引发的思考:为什么嵌入式汇编中不用指定段寄存器最近买了王爽的汇编语言和Linux内核完全注释,准备开始好好学习一下汇编语言,并看看早期的Linux(0.11版本)源代码实现。之前舍友面试TX是被问过memcpy什么时候不能用,这种问题如何解决?答:当dest,src都指向同一个数组且dest>src,那么当n大于abs(dest > src),则这个时候原创 2013-05-18 11:21:27 · 3404 阅读 · 0 评论 -
文件操作类
文件操作类<br />近来在项目中发现了很多的文件操作,故自己封装了一个文件操作类。实现代码如下:<br />/* FileName: FileOperation.cpp Author: ACb0y Create Time: 2011年3月15日20:15:03 Last Modify Time: 2011年3月15日22:52:37 */#include <iostream>using namespace std;//文件各种操作的返回值const int FILE_O原创 2011-03-15 22:59:00 · 1175 阅读 · 0 评论 -
钱能C++语言读书笔记(一)
钱能C++语言读书笔记(一)1、 头文件的内容1.1函数的声明:int Fun(); void Max();1.2全局数据的声明:extern int n;1.3类型声明:class A{};1.4全局常量定义:const float PI = 3.1415926;1.5内联函数定义:inline void fn();1.6模板声明和定义:templateclass A {…};1.7名空间定义:namespace N{};1.8类型定义:enum Color{}; class A{};1.9预编原创 2011-02-22 16:36:00 · 859 阅读 · 0 评论 -
钱能C++语言读书笔记(五)
钱能C++语言读书笔记(五)<br /> <br />1、 在高级编程中,都是用无任何牵连的干净界面来分离编程的逻辑单位的,描述界面成为一种编程的高级技巧,多继承技术也十分积极地参与了界面描述。C++标准的未来发展趋势于淡化多重继承。<br />2、 过程化的编程是通过函数模块化的堆积来展开的,它是一种行为抽象的编程。而基于对象的编程是通过抽象数据类型描述的数据对象来展开的。它是一种数据抽象的编程。<br />3、 数据结构:一系列性质相同的数据组织成一定的逻辑结构并带有自身的一系列操作。<br原创 2011-02-23 22:52:00 · 829 阅读 · 0 评论 -
钱能C++语言读书笔记(三)如何改变类成员的范围属性
钱能C++语言读书笔记(三)如何改变类成员的访问属性<br /> 在派生类中,可以调整成员的访问控制属性。例如:可以将公有成员调整为私有成员,将保护成员调整为公有成员。调整访问控制属性的前提是在派生类中该成员必须是可见的。例如,上述程序中的私有成员b1,不管如何继承,它都是不可见的。在派生类中要访问它必须通过基类的保护或公有成员函数,因此b1就无法在派生类中进行访问属性的调整,它在子孙类中永远是不可见的。<br /> 对于一个成熟的类设计来说,数据成员往往只有私有的,公有的不多见,那都是原创 2011-02-22 23:30:00 · 921 阅读 · 0 评论 -
钱能C++语言读书笔记(六)虚函数的限制
虚函数的限制1、只有类成员函数才能声明为虚函数。这是因为虚函数仅适用于有继承体系的类对象,所以普通函数不能声明为虚函数。2、静态成员函数不能是虚函数。因为静态成员函数不受对象的捆绑,即使形式上的捆绑。实际上也没有任何对象的信息,只有类的信息:void fn(Base & x){ x.Staticfn(); //只用了类的信息。 Base::Staticfn(); //调用静态成员的推荐方式。} 操作不受对象捆绑,也就失去了多态的条件。因为编译是在识别到对象的捆绑操作时,开原创 2011-02-23 23:30:00 · 850 阅读 · 0 评论 -
钱能C++语言读书笔记(二)
钱能C++语言读书笔记(二)<br /> <br />1、 有内存申请,也就有内存释放。一般来说,需要定义拷贝构造函数的类,也需要析构函数,不需要拷贝构造函数的类,也无须定义析构函数。所以析构函数与拷贝构造函数是成对出项的。<br />因为析构函数是没有参数的所以函数形式是唯一的,没有重载的析构函数。<br /> 析构函数在对象的生命周期行将结束的瞬时,由系统自动调用。因此,析构函数的调用不是通过显示语句表示的。<br />2、 转换构造函数<br />构造函数:Student(const原创 2011-02-22 21:48:00 · 754 阅读 · 0 评论 -
钱能C++语言读书笔记(四)
钱能C++语言读书笔记(四)多继承之虚拟继承(Virtual Inheritance)当一个类(A)从多个类继承(B和C)而来,而这些父类(B和C)中又有共同的父类(E),这样在最后的类A中就有祖父类E的两份拷贝,在多重继承中经常会出现这种情况,在C++在提供了虚拟继承来解决这个问题,通过虚拟继承的方式可以保证类A中只有祖父类E的一份拷贝。多继承之对象构造顺序(Mutli-Inheritance Object Constructing Order)含有多继承的构造函数按下列顺序被调用任何虚拟基类的构造函数按原创 2011-02-23 00:30:00 · 833 阅读 · 0 评论 -
排序算法-高级篇(计数排序)
排序算法-高级篇(计数排序)在前一篇的文章中我提到了非比较排序算法(基数排序),现在我要回顾的是另一种非比较排序算法(计数排序),计数排序的原理很 简单就是先统计序列中每个不同的元素出现的次数,然后再统计每个元素在排序后在序列中的位置,然后按照这个位置输出各个元素即可。代码实现如下:/* FileName: countingSort.cpp Author: ACb0y Create Time: 2011年2月14日21:12:31 Last modify Time: 2011年2月15日0:原创 2011-02-15 01:04:00 · 847 阅读 · 0 评论 -
排序算法-中级篇(归并排序)
/* FileName: MergeSort.cpp Author: ACb0y Create Time: 2011年2月15日14:49:47 Last modify Time: 2011年2月15日15:55:58 */#include using namespace std;/* 函数名: template void print(type * data, int n, char * format); 功能:输出元素序列中所有的元素 参数:原创 2011-02-15 16:35:00 · 925 阅读 · 0 评论 -
排序算法-高级篇(基数排序)
排序算法-高级篇在前两篇文章中,我回归了最基本最easy的排序算法(冒泡排序、选择排序)它们的时间复杂度都为O(n^2)和快速排序(时间复杂度为O(nlog(n))),而选择我要回顾的是更为高效的基数排序(基数排序的使用范围有所限制,它只能用在正整数的排序)它的时间复杂度为O(nlog10(max)),max = Max{data[0], data[1], ...}。我程序的实现是从低位->高位进行扫描。下面举个例子。有数据 data[6] = {13, 14, 15, 24, 35, 100},因为max原创 2011-02-13 23:36:00 · 947 阅读 · 0 评论 -
排序算法-中级篇
排序算法-中级篇<br />上一篇文章中我回顾了在学习入门计算机语言时最初接触的排序算法(冒泡排序,选择排序),不管是冒泡排序还是选择排序,它们的效率都不高时间复杂度都为O(n^2),对于大规范的数据出来是不能接受了,因而就需要更高效的排序算法。在这里我回顾一下我们在数据结构与算法这门课学习到的堆排序(O(nlog(n))),算法逻辑我就不赘述了,大家都知道。<br />代码实现上我是用C++的函数模板来实现。<br />实现代码如下:<br />/* FileName: qsort.cpp Aut原创 2011-02-13 17:38:00 · 774 阅读 · 0 评论 -
如何用C语言获取文件的大小
如何用C语言获取文件的大小今天看项目的代码过程中发现在linux下获取一个指定文件大小(字节为单位)的代码。查了一下发现是使用系统调用stat来实现,而这引起了我的兴趣,我发现在window下貌似没有提供这样的系统调用(不包括MFC),那么如何使用C语言或C++语言来写一个通用的函数来获取指定文件大小的函数呢?查了一下发现同C语言的文件操作函数便可以很容易的实现这样的功能。在自己实现的函数中使用到的函数就只有fseek和ftell。它们的说明如下:fseek语法: #include int fse原创 2011-02-12 21:03:00 · 15877 阅读 · 2 评论 -
C++关键字之explicit
C++关键字之explicit<br />c++中一个关键字为explicit,这个关键字是用来表明系统不能默认调用类的转换构造函数,要进行类型转换构造函数的调用,需要显示调用。<br />Demo代码如下:<br />/* FileName: explicitDemo.cpp Author: ACb0y Create Time: 2011年3月3日11:49:23 */#include <iostream>using namespace std;//测试类class Tes原创 2011-03-03 11:54:00 · 835 阅读 · 0 评论 -
C字符串的三种遍历方式
C字符串的三种遍历方式C字符串是用char [],字符数组来表示的,对于字符串的变量通常有两种,在这里中总结一下。代码如下:#include using namespace std;void foreachStringOne(char * str){ int len = strlen(str); for (int i = 0; i原创 2011-03-19 22:22:00 · 40500 阅读 · 1 评论 -
常用字符串hash函数总结
/** * FileName: allHash.cpp * Author: ACb0y * Create Time: 2011年3月20日21:55:53 * Last Modify Time: 2001年3月21日0:00:22 */ #include using namespace std;typedef unsigned int uint;typedef struct node { char * str; struct node * pNext;}n原创 2011-03-21 00:16:00 · 5345 阅读 · 4 评论 -
一起来学POSIX thread 之 线程状态
一起来学POSIX thread 之 线程状态1、线程的四种基本状态的转换在OS中线程作为最基本的调度单元,它存在着四种基本状态,各个状态的转化情况如下图。四种状态的含义如下:1)就绪状态:线程能够运行,但在等待可用的处理器。可能刚刚启动,或刚刚从阻塞中恢复,或者从运行状态中被其他线程抢占从运行状态转变为就绪状态。2)运行状态:线程正在运行。在多处理器系统中,可原创 2013-02-11 22:02:19 · 1208 阅读 · 0 评论 -
一起来学POSIX thread 之 不变量、临界区、谓词
一起来学POSIX thread 之 不变量、临界区、谓词1、不变量(invariant)所谓的不变量是由程序作出的假设,特别是有关变量组间关系的假设。当编写队列包时,你需要为每一个队列指定一个队列头指针,指向队列的第一个元素。每一个数据元素也包含指向下一个元素的指针。重要的并不完全是数据,程序还要依赖于数据之间的关系。例如,队列或者为空,或者包含一个指向队首元素的指针。数据元素包含的指针原创 2013-02-12 21:11:33 · 2348 阅读 · 0 评论 -
一起来学POSIX thread 之 线程的创建和基本操作接口
一起来学POSIX thread 之 线程的创建和基本操作接口1、线程的创建我们之前提到了POSIX thread的三个基本核心要输:执行环境、调度、同步。在这里我们首先介绍一下执行环境(Unix环境下)如何创建,POSIX thread提供了pthread_create接口用来创建线程。pthread_create的原型如下:int pthread_create(pthread_t原创 2013-02-10 23:46:15 · 3419 阅读 · 0 评论 -
一起来学POSIX thread 之 结构概览、基本数据类型和报错机制
一起来学POSIX thread 之 结构概览、基本数据类型和报错机制1、结构概览任何一个线程系统都包括三个基本要素:执行环境、调度和同步。在评估一个线程系统或者比较任意两个线程系统时,都可以从比较它们对这三个方面的支持开始。POSIX thread通过调用pthread_create来创建执行环境(线程)。创建一个线程同样也调度了该线程的执行,这将通过调用指定的“线程启动”函原创 2013-02-09 11:37:24 · 1916 阅读 · 0 评论 -
一起来学POSIX thread 之 线程利弊与选择
一起来学POSIX thread 之 线程利弊与选择1、线程的利在多处理器系统中,利用线程的并行性可以提高计算性能。一个运行在双CPU上的计算密集型多线程程序几乎可以获得传统的单线程程序两倍的性能。“几乎两倍”是基于这样的事实:创建额外的线程和执行线程间的同步会带来额外的开销。虽然线程在多处理器的系统中能带来程序性能的提高,但性能的提高并不和处理器的个数成正比,而是和线程的并行原创 2013-02-08 22:26:05 · 2331 阅读 · 0 评论 -
一起来学POSIX thread 之 基本概念
一起来学POSIX thread 之 基本概念1、异步(asynchronous)异步指互不干扰的事件可以独立的发生,除非事件之间存在着依赖性.生活中存在着大量的异步事件,例如你可以一边喝茶,一边烧开水。异步带来的最大复杂性就是:如果你没有同时执行多个活动,那么异步就没有任何优势可言。如果你开始了一个异步活动,然后什么也不做等待它结束,则你并没有从异步中获得任何好处。2、并发(co原创 2013-02-08 00:08:11 · 2285 阅读 · 0 评论 -
基于策略(policy)的类设计方法
基于策略(policy)的类设计方法通常类的功能是复杂的,而基于策略(policy)的设计方面把类的功能分离出来,变成粒度小的模块,每个模块完成不同的策略,通过不同的策略模块有序的组装从而实现整个类复杂的功能。将class分解成policies时,要遵守两条重要的准则。第一,把你的class内的“设计决定”局部化、命名、分离出来。第二,找出正交的policies,也就是彼此之间无交互左右、原创 2012-08-20 00:46:36 · 1288 阅读 · 0 评论 -
面向对象编程VS泛型编程
面向对象编程VS泛型编程1、面向对象浅析 OOP是对data&&operation的封装,是对同类事物的抽象,跟结构化编程相比它更接近自然语言。继承使得OO具有了更强的表达能力,进一步地接近了自然语言的属性。而多态则是OO的最为巧妙和强大的地方,它催生了一系原创 2011-09-20 23:51:15 · 2330 阅读 · 0 评论 -
OCI常用函数
一. Oracle oci工具包安装: $ORACLE_HOME\BIN:执行文件和help文件 $ORACLE_HOME\OCI\INCLUDE:头文件 $ORACLE_HOME\OCI\LIB\BC: for Borlanf C++的OCI库 $ORACLE_HOME\OC转载 2011-07-16 12:49:17 · 1677 阅读 · 0 评论 -
用g++编译生成动态连接库*.so的方法及连接
用g++编译生成动态连接库*.so的方法及连接1、动态库*.so的编译 这里我们用到4个文件,它们分别为:SoDemoTest.h、one.cpp、two.cpp、three.cpp。它们的内容如下: SoDemoTest.h#ifndef __SO_DEMO_TEST_HEADER__#define __SO_DEMO_TEST_HEADER__#include原创 2011-06-18 10:09:00 · 37565 阅读 · 2 评论 -
unix/linux中书中一直提到的“ourhdr.h”文件内容
/*Our own header, to be included after all standard system headers*/#ifndef __ourhdr_h #define __ourhdr_h #include /*for definition of errno */#include /*ANSI C header file*/#includ原创 2011-06-13 09:02:00 · 2901 阅读 · 0 评论 -
数字字符串转整型数据的4种方法
数字字符串转整型数据的4种方法<br />在项目开发中,我们经常需要把数字字符串(值在整型数据的能够表示的范围内)转换成整型数据,这里我总结C/C++中4种不同转换方式:<br />1、使用system call调用atoi()来实现。<br />2、使用system call调用sscanf()来实现。<br />3、使用C++的字符串流对象来实现。<br />4、自己手动转换。<br />Demo代码如下:<br />/* FileName: main.cpp Author: ACb0y C原创 2011-03-27 23:40:00 · 6626 阅读 · 0 评论 -
HBST = Hash-BinarySortTree
Hash-BinarySortTree在上一篇的文章中我对字符串常见的Hash函数进行了总结,在原来的代码中Hash的缓冲数组的元素是一条链表。即每个元素下“挂”的是一个单链表。我采用了设计模式中的策略模式对上次的代码进行了改造,把每个hash函数封装成一个类,这样程序更易于扩展和修改。除了对原来的代码进行重构之外,在Hash缓冲区数组中,每个元素下“挂”的不再是单链表,而是BinarySortTree(二叉排序树),本来想“挂”BalanceBinaryTree(平衡二叉树)后面考虑编程复杂度太大了,就没原创 2011-03-21 23:08:00 · 1591 阅读 · 0 评论 -
C++读书笔记之第四类类型转换(reinterpret_cast)
C++读书笔记之第四类类型转换(reinterpret_cast)第四种新的类型转换reinterpret_cast转换结果常常是由(编译器)实现所定义的,因此,reinterpret_cast?几乎是不可移植的。reinterpret_cast最常见的用法是用来在函数指针之间的一种类型转换。比如说,假设你有一个指针数组,这些指针指向特定类型的函数:typedef void (*FuncPtr) ();FuncPtr funcPtrArray[10];//funcPtrArray is a array of原创 2011-02-28 22:43:00 · 1369 阅读 · 0 评论 -
C++读书笔记之抽象
C++读书笔记之抽象<br />抽象编程的关键在于界面的相对稳定性。但是,不变的事物是没有的,包括界面。如何使界面保持相对稳定,或者说如何设计和维护界面,便是恒久保持抽象编程质量的关键。<br />抽象类与与纯虚函数<br />抽象类:在类定义中至少声明一个纯虚函数。<br />纯虚函数:所谓纯虚函数是指被标明为不具体实现的虚函数。例如:我并不知道怎样实现virtual Account::withdrawal(),那么就不用勉强下一个定义,只要声明为纯虚函数就行了。纯虚函数一旦声明,就不用定义。纯虚函数的声原创 2011-02-28 20:57:00 · 781 阅读 · 0 评论 -
C++读书笔记之泛型编程&&虚函数表&&volatile
C++读书笔记之泛型编程模板编程就是泛型编程。就好像虚函数编程就是面向对象编程一样。于是,只要程序中用到了模板声明和定义,就是属于泛型编程了。然而从广义上说,泛型编程更讲究目的:模板设计的目的就是为了能得到多种类型的有效通用。原创 2011-02-28 21:51:00 · 1118 阅读 · 0 评论 -
迭代器模式
迭代器模式<br /> 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而不是暴露该对象的内部表示。<br /> 一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。你需要对聚集有多种方式遍历时,可以考虑用迭代器模式。为遍历不同的聚集结构提供如开始,下一个,是否结束,当前哪一项等统一的接口。<br />UML图如下:<br /><br />C++实现代码如下:<br />/* Author: ACb0y Date: 2010原创 2010-12-20 21:38:00 · 937 阅读 · 0 评论 -
备忘录模式
备忘录模式<br /> 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。<br /> Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可以使用备忘录恢复内部状态。Originator可根据需要决定Memento存储Originator的那些内部状态。<br /> Memento(备忘录):负责存储Originator对象内部状态,并可防原创 2010-12-20 16:12:00 · 843 阅读 · 0 评论 -
状态模式
状态模式<br /> 状态模式(State),当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。<br />状态模式主要解决的是当控制一个对象的状态转换的条件表达式过于复杂时的情况。把状态的判断逻辑移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。<br />UML图如下:<br /><br />C++代码实现如下:<br />/* Author: ACb0y Date: 2010年12月18日21:33:26 Model: State(状态模式)原创 2010-12-18 23:06:00 · 934 阅读 · 0 评论 -
抽象工厂模式(Abstract Factory)
抽象工厂模式<br /> 抽象工厂模式(Abstract Factory)提高一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。<br /> AbstractProductA和AbstractProductB是两个抽象产品,之所以为抽象,是因为它们都有可能有两种不同的实现。<br /> AbstractFactory是一个抽象工厂接口,它里面应该包含所有的产品创建的抽象方法。而ConcreteFactory1和ConcreteFactory2就是具体的工厂了。<br原创 2010-12-17 22:09:00 · 988 阅读 · 0 评论 -
外观模式(Facade)
外观模式<br /> 为了系统中一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。<br /> <br />UML图如下:<br /><br /> <br />C++代码实现如下:<br /> <br />/* Author: ACb0y Date: 2010年12月16日12:29:59 Model: Facade(外观模式) */#include <iostream>using namespace std;class原创 2010-12-16 14:25:00 · 859 阅读 · 0 评论 -
模板方法模式
模板方法模式<br /> 定义了一个操作中的算法的骨架,而将一些步骤延迟到了子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。<br /> 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但某个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法来处理。<br /> <br />UML图如下:<br /><br /> <br />C++实现代码如下:<br /> <br />/* Author: ACb0y Date: 2010年12月16原创 2010-12-16 12:17:00 · 804 阅读 · 0 评论 -
代理模式-为别人做嫁衣
代理模式 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。Subject类定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy。UML图如下:C++实现代码如下:/* Author: ACb0y Date: 2010年12月15日18:32:26 Model: Decorator(装饰模式) */#include #include using namespace std;//抽原创 2010-12-15 21:57:00 · 1102 阅读 · 0 评论 -
技术与艺术的结合
技术与艺术的结合 编程是一门技术,更加是一门艺术,不能满足于写完代码运行结果正确就算完事,时常考虑如何更加简练,更加容易维护,容易扩展和复用,只有这样才可以真正得到提高。写出优雅的代码是一种很爽的事情。原创 2010-12-15 19:04:00 · 855 阅读 · 0 评论