2018年2月25日

类模板、Stack的类模板实现(自定义链栈方式,自定义数组方式)

摘要: 一、类模板 类模板:将类定义中的数据类型参数化 类模板实际上是函数模板的推广,可以用相同的类模板来组建任意类型的对象集合 (一)、类模板的定义 template <类型形参表> class <类名> { //类说明体 }; template <类型形参表> <返回类型> <类名> <类型名表>::< 阅读全文

posted @ 2018-02-25 23:39 AlanTu 阅读(1088) 评论(0) 推荐(0)

函数模板、函数模板特化、重载函数模板、非模板函数重载

摘要: 一、引子 考虑求两数较大值函数max(a,b) 对于a,b的不同类型,都有相同的处理形式: return a < b ? b : a; 用已有方法解决: (1)宏替换 #define max(a,b) ((a)< (b) ? (b) : (a)) 存在的问题:避开类型检查 (2)重载 存在的问题:需 阅读全文

posted @ 2018-02-25 23:38 AlanTu 阅读(943) 评论(0) 推荐(0)

输出流格式化(以操纵子方式格式化,以ios类成员函数方式格式化)

摘要: 一、以操纵子方式格式化 数据输入输出的格式控制使用系统头文件<iomanip>中提供的操纵符。把它们作为插入操作符<<的输出对象即可。如setiosflags、setw、setfill、setprecision、hex、oct等。 (一)、常用的流操纵算子: (二)、ios类的枚举常量 C++ Co 阅读全文

posted @ 2018-02-25 23:36 AlanTu 阅读(679) 评论(0) 推荐(0)

文件的读写、二进制文件的读写、文件随机读写

摘要: 一、文件的读写 如前面所提,流的读写主要有<<, >>, get, put, read, write 等操作,ofstream 继承自ostream, ifstream 继承自 istream,故操作函数都是一致的。 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 阅读全文

posted @ 2018-02-25 23:35 AlanTu 阅读(2986) 评论(0) 推荐(0)

文件流(fstream, ifstream, ofstream)的打开关闭、流状态

摘要: 一、文件流 ofstream,由ostream派生而来,用于写文件 ifstream,由istream派生而来, 用于读文件 fstream,由iostream派生而来,用于读写文件 二、打开文件 说明了流对象之后,可使用函数open()打开文件。文件的打开即是在流与文件之间建立一个连接 函数原型 阅读全文

posted @ 2018-02-25 23:34 AlanTu 阅读(13831) 评论(0) 推荐(0)

流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作

摘要: 一、IO、流 数据的输入和输出(input/output简写为I/O) 对标准输入设备和标准输出设备的输入输出简称为标准I/O 对在外存磁盘上文件的输入输出简称为文件I/O 对内存中指定的字符串存储空间的输入输出简称为串I/O 数据输入输出的过程,可以形象地看成流 从流中获取数据的操作称为“提取”( 阅读全文

posted @ 2018-02-25 23:32 AlanTu 阅读(731) 评论(0) 推荐(0)

对象语义与值语义、资源管理(RAII、资源所有权)、模拟实现auto_ptr<class>、实现Ptr_vector

摘要: 一、对象语义与值语义 1、值语义是指对象的拷贝与原对象无关。拷贝之后就与原对象脱离关系,彼此独立互不影响(深拷贝)。比如说int,C++中的内置类型都是值语义,前面学过的三个标准库类型string,vector,map也是值语义 2、对象语义指的是面向对象意义下的对象 对象拷贝是禁止的(Noncop 阅读全文

posted @ 2018-02-25 23:31 AlanTu 阅读(373) 评论(0) 推荐(0)

operator new 和 operator delete 实现一个简单内存泄漏跟踪器

摘要: 先来说下实现思路:可以实现一个Trace类,调用 operator new 的时候就将指向分配内存的指针、当前文件、当前行等信息添加进Trace 成员map容器内,在调用operator delete 的时候删除这些信息。定义一个全局Trace 对象,当程序结束,对象析构时判断成员map 是否还有信 阅读全文

posted @ 2018-02-25 23:28 AlanTu 阅读(385) 评论(0) 推荐(0)

异常与继承、异常与指针、异常规格说明

摘要: 一、异常与继承 如果异常类型为C++的类,并且该类有其基类,则应该将派生类的错误处理程序放在前面,基类的错误处理程序放在后面 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 阅读全文

posted @ 2018-02-25 23:26 AlanTu 阅读(487) 评论(0) 推荐(0)

程序错误、异常(语法、抛出、捕获、传播)、栈展开

摘要: 一、程序错误 编译错误,即语法错误。程序就无法被生成运行代码。 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数相乘可能溢出 数组越界…… 二、异常 (一)、异常语法 throw 表达式; try { //try 阅读全文

posted @ 2018-02-25 23:25 AlanTu 阅读(1112) 评论(0) 推荐(0)

C语言错误处理方法、C++异常处理方法(throw, try, catch)简介

摘要: 一、C语言错误处理方法 1、返回值(if … else语句判断错误) 2、errno(linux 系统调用) 3、goto语句(函数内局部跳转) 4、setjmp、longjmp(Do not use setjmp and longjmp in C++ programs; these functio 阅读全文

posted @ 2018-02-25 23:24 AlanTu 阅读(3936) 评论(0) 推荐(0)

RTTI、dynamic_cast、typeid、类与类之间的关系uml

摘要: 一、RTTI Run-time type information (RTTI) is a mechanism that allows the type of an object to be determined during program execution. There are three ma 阅读全文

posted @ 2018-02-25 23:22 AlanTu 阅读(378) 评论(0) 推荐(0)

动态创建对象

摘要: 回顾前面的文章,实现了一个简单工厂模式来创建不同类对象,但由于c++没有类似new "Circle"之类的语法,导致数中需要不断地ifelse地去判断,如果有多个不同类对象需要创建,显然这是很费神的,下面通过宏定义注册的方法来实现动态创建对象 C++ Code 1 2 3 4 5 6 7 8 9 1 阅读全文

posted @ 2018-02-25 23:21 AlanTu 阅读(1784) 评论(0) 推荐(0)

对C++对象内存模型造成的影响(类/对象的大小)

摘要: 首先重新回顾一下关于类/对象大小的计算原则: 类大小计算遵循结构体对齐原则 第一个数据成员放在offset为0的位置 其它成员对齐至min(sizeof(member),#pragma pack(n)所指定的值)的整数倍。 整个结构体也要对齐,结构体总大小对齐至各个min中最大值的整数倍。 win3 阅读全文

posted @ 2018-02-25 23:18 AlanTu 阅读(494) 评论(0) 推荐(0)

多重继承、虚继承与虚基类

摘要: 一、多重继承 单重继承——一个派生类最多只能有一个基类 多重继承——一个派生类可以有多个基类 class 类名: 继承方式 基类1,继承方式 基类2,…. {….}; 派生类同时继承多个基类的成员,更好的软件重用 可能会有大量的二义性,多个基类中可能包含同名变量或函数 多重继承中解决访问歧义的方法: 阅读全文

posted @ 2018-02-25 23:11 AlanTu 阅读(2040) 评论(0) 推荐(1)

继承与构造函数、派生类到基类的转换

摘要: 一、不能自动继承的成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 基类的构造函数不被继承,派生类中需要声明自己的构造函数。 声明构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化调用基类构造函数完成(如果没有给出则默认调用默认构造函数)。 派生类 阅读全文

posted @ 2018-02-25 23:09 AlanTu 阅读(984) 评论(0) 推荐(0)

公有/私有/保护继承、overload/overwrite/override之间的区别

摘要: 一、继承 C++很重要的一个特征就是代码重用。在C语言中重用代码的方式就是拷贝代码、修改代码。C++可以用继承或组合的方式来重用。通过组合或继承现有的的类来创建新类,而不是重新创建它们。 继承是使用已经编写好的类来创建新类,新的类具有原有类的所有属性和操作,也可以在原有类的基础上作一些修改和增补。 阅读全文

posted @ 2018-02-25 23:08 AlanTu 阅读(744) 评论(0) 推荐(0)

map 类简介和例程

摘要: 一、标准库的map类型 使用map得包含map类所在的头文件 template < class Key, class Type, class Traits = less<Key>, class Allocator=allocator<pair <const Key, Type> > > class 阅读全文

posted @ 2018-02-25 23:06 AlanTu 阅读(215) 评论(0) 推荐(0)

vector 类简介和例程

摘要: 一、标准库的vector类型 vector是同一种类型的对象的集合 vector的数据结构很像数组,能非常高效和方便地访问单个元素 vector是一个类模板(class template) vector不能存放引用。 template < class Type, class Allocator = 阅读全文

posted @ 2018-02-25 23:04 AlanTu 阅读(463) 评论(0) 推荐(0)

string 类简介和例程

摘要: 一、标准库string类型 string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作 ,在VC中直接F1查看 template < class CharType, class Traits=char_traits<CharType>, class Al 阅读全文

posted @ 2018-02-25 23:03 AlanTu 阅读(487) 评论(0) 推荐(0)

类型转换运算符、*运算符重载、->运算符重载、operator new 和 operator delete

摘要: 一、类型转换运算符 必须是成员函数,不能是友元函数 没有参数 不能指定返回类型 函数原型:operator 类型名(); C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #ifndef _INTEGER_H_ 阅读全文

posted @ 2018-02-25 23:01 AlanTu 阅读(396) 评论(0) 推荐(0)

完善String类([]、 +、 += 运算符重载)、>>和<<运算符重载

摘要: 在前面文章中使用过几次String类的例子,现在多重载几个运算符,更加完善一下,并且重载流类运算符。 []运算符重载 +运算符重载 +=运算符重载 <<运算符重载 >>运算符重载 String.h: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 阅读全文

posted @ 2018-02-25 23:00 AlanTu 阅读(7765) 评论(0) 推荐(1)

++运算符重载、!运算符重载、赋值运算符重载

摘要: 一、++运算符重载 前置++运算符重载 成员函数的方式重载,原型为: 函数类型 & operator++(); 友元函数的方式重载,原型为: friend 函数类型 & operator++(类类型 &); 后置++运算符重载 成员函数的方式重载,原型为: 函数类型 operator++(int); 阅读全文

posted @ 2018-02-25 22:59 AlanTu 阅读(473) 评论(0) 推荐(0)

以成员函数方式重载、以友元函数方式重载

摘要: 一、运算符重载 运算符重载允许把标准运算符(如+、-、*、/、<、>等)应用于自定义数据类型的对象 直观自然,可以提高程序的可读性 体现了C++的可扩充性 运算符重载仅仅只是语法上的方便,它是另一种函数调用的方式 运算符重载,本质上是函数重载 不要滥用重载、因为它只是语法上的方便,所以只有在涉及的代 阅读全文

posted @ 2018-02-25 22:57 AlanTu 阅读(3181) 评论(0) 推荐(0)

友元函数和友元类

摘要: 一、友元介绍 我们知道,类的成员函数可以访问同类的其他成员函数,包括公有、私有和保护成员。而类的外部函数只能访问类的公有成员。 友元是一种允许非类成员函数访问类的非公有成员的一种机制。 可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元。 友元函数 友元类 二、友元函数 友元函数在类作 阅读全文

posted @ 2018-02-25 22:56 AlanTu 阅读(1152) 评论(0) 推荐(0)

分别用C和C++来实现一个链栈

摘要: 下面通过分别用C和C++来实现一个链栈(链表实现),从中体会数据封装抽象的思想: C语言实现: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 阅读全文

posted @ 2018-02-25 22:54 AlanTu 阅读(403) 评论(0) 推荐(0)

static 与单例模式、auto_ptr与单例模式、const 用法小结、mutable修饰符

摘要: 一、static 与单例模式 单例模式也就是简单的一种设计模式,它需要: 保证一个类只有一个实例,并提供一个全局访问点 禁止拷贝 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 2 阅读全文

posted @ 2018-02-25 22:53 AlanTu 阅读(379) 评论(0) 推荐(0)

四种对象生存期和作用域、static 用法总结

摘要: 一、四种对象生存期和作用域 栈对象 隐含调用构造函数(程序中没有显式调用) 堆对象 隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象、静态全局对象 全局对象的构造先于main函数 已初始化的全局变量或静态全局对象存储于.data段中 未初始化的全局变量或静态全局对象存储于.bss段中 静 阅读全文

posted @ 2018-02-25 22:51 AlanTu 阅读(1256) 评论(0) 推荐(0)

static 成员变量、static 成员函数、类/对象的大小

摘要: 一、static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量。比如说统计某种类型对象已创建的数量。 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时可以用类的静态成员来解决这个问题。 非static数据成员存在于类类型的每个对象中,stati 阅读全文

posted @ 2018-02-25 22:50 AlanTu 阅读(1895) 评论(0) 推荐(0)

深拷贝与浅拷贝、空类与空数组

摘要: 一、深拷贝与浅拷贝 说得简单点,假设一个类有指针成员,如果在拷贝的时候顺带连指针指向的内存也分配了,就称为深拷贝,如下图(v2 从 v 拷贝而来): 如果只是分配指针本身的内存,那就是浅拷贝,如下图: 浅拷贝造成的问题是有两个指针指向同块内存,delete 其中一个指针,那么剩下的指针将成为野指针。 阅读全文

posted @ 2018-02-25 22:48 AlanTu 阅读(528) 评论(0) 推荐(0)

初始化列表(const和引用成员)、拷贝构造函数

摘要: 一、构造函数初始化列表 推荐在构造函数初始化列表中进行初始化 构造函数的执行分为两个阶段 初始化段 普通计算段 (一)、对象成员及其初始化 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 阅读全文

posted @ 2018-02-25 22:47 AlanTu 阅读(2888) 评论(0) 推荐(0)

构造函数、析构函数、赋值与初始化、explicit关键字

摘要: 一、构造函数、默认构造函数 (1)、构造函数 构造函数是特殊的成员函数 创建类类型的新对象,系统自动会调用构造函数 构造函数是为了保证对象的每个数据成员都被正确初始化 函数名和类名完全相同 不能定义构造函数的类型(返回类型),也不能使用void 通常情况下构造函数应声明为公有函数,一般被隐式地调用。 阅读全文

posted @ 2018-02-25 22:44 AlanTu 阅读(825) 评论(0) 推荐(0)

类声明、类作用域、前向声明、this指针、嵌套类、PIMPL 技法 等

摘要: 一、类声明 //类是一种用户自定义类型,声明形式: class 类名称 { public: 公有成员(外部接口) private: 私有成员 protected: 保护成员 }; 在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。 在关键字private后 阅读全文

posted @ 2018-02-25 22:43 AlanTu 阅读(420) 评论(0) 推荐(0)

引用、数组引用与指针引用、内联函数inline、四种类型转换运算符

摘要: 一、引用 (1)、引用是给一个变量起别名 定义引用的一般格式:类型 &引用名 = 变量名; 例如:int a=1; int &b=a;// b是a的别名,因此a和b是同一个单元 注意:定义引用时一定要初始化,指明该引用是谁的别名 在实际应用中,引用一般用作参数传递与返回值 引用不是变量,引用仅仅只是 阅读全文

posted @ 2018-02-25 22:41 AlanTu 阅读(575) 评论(0) 推荐(0)

const与#define、结构体对齐、函数重载name mangling、new/delete 等

摘要: 一、bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节。 声明方式:bool result; result=true; 可以当作整数用(true一般为1,false为0) 把其它类型的值转换为布尔值时,非零 阅读全文

posted @ 2018-02-25 22:39 AlanTu 阅读(319) 评论(0) 推荐(0)

实现一些字符串操作标准库函数、解决一些字符串问题

摘要: 一、实现字符串操作标准库函数 (1)、strcpy、strncpy、memmove、memcpy、memset、strlen、strncat 的实现 C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 阅读全文

posted @ 2018-02-25 22:36 AlanTu 阅读(672) 评论(0) 推荐(0)

windows下LIB和DLL的区别与使用

摘要: 共有两种库: 一种是LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。 一种是LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。 阅读全文

posted @ 2018-02-25 22:34 AlanTu 阅读(9899) 评论(1) 推荐(2)

C++模板类内友元(友元函数,友元类)声明的三种情况

摘要: 根据《C++ Primer》第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数。 书上给了一个例子: class Foo{ void bar(); }; template <class T> class QueueItem{ friend class foobar; 阅读全文

posted @ 2018-02-25 22:31 AlanTu 阅读(3719) 评论(0) 推荐(0)

字符编解码的故事(ASCII,GBK,Unicode,Utf-8区别)

摘要: 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节"。 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出更多的状态,状态开始变来变去。他们看到这样是好的,于是它们就这机 阅读全文

posted @ 2018-02-25 22:30 AlanTu 阅读(386) 评论(0) 推荐(0)

C++中四种类型转换以及const_cast是否能改变常量的问题

摘要: we have four specific casting operators:dynamic_cast, reinterpret_cast, static_cast and const_cast. Their format is to follow the new type enclosed be 阅读全文

posted @ 2018-02-25 22:28 AlanTu 阅读(3322) 评论(0) 推荐(1)

预处理、编译和运行的区别

摘要: 相信很多人懂这个问题,也很多人没想过,包括我,今天看书想到了就写下来。先看程序(抱歉在linux下没有找到舒服的可以复制terminal的工具,只好截图了,将就着看看) 注释的就先不看了,看那几行没有注释的enum coordinate_type 表示一个枚举(Enumeration)类型。枚举类型 阅读全文

posted @ 2018-02-25 22:23 AlanTu 阅读(2389) 评论(0) 推荐(0)

C++的引用与const指针的关系以及各种传递方式

摘要: 首先我们知道 const int *p 与 int const *p 是一样的,即 *p 是常量;而 int * const p 跟上面是不一样的,即 p 是常量;我们知道引用只是一个别名,与变量共享存储空间,并且必须在定义的时候初始化,而且不能再成为别的变量的别名,这让我们想到什么呢,貌似跟 in 阅读全文

posted @ 2018-02-25 22:18 AlanTu 阅读(884) 评论(0) 推荐(0)

比较显式调用构造函数和析构函数

摘要: 1.首先看如下的代码,显式调用析构函数: C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include <iostream> using namespace std 阅读全文

posted @ 2018-02-25 22:09 AlanTu 阅读(643) 评论(0) 推荐(0)

Linux 最新SO_REUSEPORT特性

摘要: 1、前言 昨天总结了一下Linux下网络编程“惊群”现象,给出Nginx处理惊群的方法,使用互斥锁。为例发挥多核的优势,目前常见的网络编程模型就是多进程或多线程,根据accpet的位置,分为如下场景: (1)单进程或线程创建socket,并进行listen和accept,接收到连接后创建进程和线程处 阅读全文

posted @ 2018-02-25 15:35 AlanTu 阅读(4609) 评论(0) 推荐(0)

Linux网络编程“惊群”问题总结

摘要: 1、前言 我从事Linux系统下网络开发将近4年了,经常还是遇到一些问题,只是知其然而不知其所以然,有时候和其他人交流,搞得非常尴尬。如今计算机都是多核了,网络编程框架也逐步丰富多了,我所知道的有多进程、多线程、异步事件驱动常用的三种模型。最经典的模型就是Nginx中所用的Master-Worker 阅读全文

posted @ 2018-02-25 15:31 AlanTu 阅读(756) 评论(0) 推荐(0)

Linux下connect超时处理

摘要: 1、前言 最近在写一个测试工具,要求快速的高效率的扫描出各个服务器开放了哪些端口。当时想了一下,ping只能检测ip,判断服务器的网络是连通的,而不能判断是否开放了端口。我们知道端口属于网络的传输层,因此需要用ip和端口来探测,这个时候就可以用connect来探测一下,针对TCP协议,connect 阅读全文

posted @ 2018-02-25 15:25 AlanTu 阅读(7186) 评论(0) 推荐(0)

TCP与UDP在socket编程中的区别

摘要: 一、TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可能丢包 TCP保证数据顺序,UDP不保证 部分满足以下几点要求时,应该采用UDP 面向数据报方式 网络数据大多为短消息 拥有大量Client 阅读全文

posted @ 2018-02-25 15:22 AlanTu 阅读(304) 评论(0) 推荐(0)

select、poll、epoll之间的区别

摘要: select,poll,epoll都是IO多路复用的机制。I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说 阅读全文

posted @ 2018-02-25 15:17 AlanTu 阅读(2179) 评论(0) 推荐(0)

IO多路复用之epoll

摘要: 1、基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次 阅读全文

posted @ 2018-02-25 15:00 AlanTu 阅读(1044) 评论(0) 推荐(0)

IO多路复用之poll

摘要: 1、基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制。poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文 阅读全文

posted @ 2018-02-25 14:56 AlanTu 阅读(340) 评论(0) 推荐(0)

IO多路复用之select

摘要: 1、基本概念 IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合: (1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。 (2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。 (3)如果一个TC 阅读全文

posted @ 2018-02-25 14:54 AlanTu 阅读(456) 评论(0) 推荐(0)

并发无锁队列

摘要: 并发无锁队列学习之一【开篇】 1、前言 队列在计算机中非常重要的一种数据结构,尤其在操作系统中。队列典型的特征是先进先出(FIFO),符合流水线业务流程。在进程间通信、网络通信之间经常采用队列做缓存,缓解数据处理压力。结合自己在工作中遇到的队列问题,总结一下对不同场景下的队列实现。根据操作队列的场景 阅读全文

posted @ 2018-02-25 13:13 AlanTu 阅读(26137) 评论(0) 推荐(1)

《算法导论》读书笔记(七)

摘要: 《算法导论》读书笔记之第16章 贪心算法—活动选择问题 前言:贪心算法也是用来解决最优化问题,将一个问题分成子问题,在现在子问题最优解的时,选择当前看起来是最优的解,期望通过所做的局部最优选择来产生一个全局最优解。书中先从活动选择问题来引入贪心算法,分别采用动态规划方法和贪心算法进行分析。本篇笔记给 阅读全文

posted @ 2018-02-25 13:05 AlanTu 阅读(428) 评论(0) 推荐(0)

《算法导论》读书笔记(六)

摘要: 《算法导论》读书笔记之第15章 动态规划—装配线调度 前言:动态规划的概念 动态规划(dynamic programming)是通过组合子问题的解而解决整个问题的。分治算法是指将问题划分为一些独立的子问题,递归的求解各个问题,然后合并子问题的解而得到原问题的解。例如归并排序,快速排序都是采用分治算法 阅读全文

posted @ 2018-02-25 13:02 AlanTu 阅读(327) 评论(0) 推荐(0)

数组的连续最大子段和

摘要: 问题描述:输入是一个大小为n的整型数组,要求输出数组的任何连续子数组中的最大值。例如:输入的数组为array[10] = {31,-41,59,26,-53,58,97,-93,-23,84};输出最大连续子数组和为array[2...6]:187 算法1:对所有满足0<=i<=j<=n的(i,j) 阅读全文

posted @ 2018-02-25 12:56 AlanTu 阅读(390) 评论(0) 推荐(0)

《算法导论》读书笔记(五)

摘要: 《算法导论》读书笔记之第12章 二叉查找树 摘要: 本章介绍了二叉查找树的概念及操作。主要内容包括二叉查找树的性质,如何在二叉查找树中查找最大值、最小值和给定的值,如何找出某一个元素的前驱和后继,如何在二叉查找树中进行插入和删除操作。在二叉查找树上执行这些基本操作的时间与树的高度成正比,一棵随机构造 阅读全文

posted @ 2018-02-25 12:55 AlanTu 阅读(403) 评论(0) 推荐(0)

《算法导论》读书笔记(四)

摘要: 《算法导论》读书笔记之第10章 基本数据结构 摘要 本章介绍了几种基本的数据结构,包括栈、队列、链表以及有根树,讨论了使用指针的简单数据结构来表示动态集合。本章的内容对于学过数据结构的人来说,没有什么难处,简单的总结一下。 1、栈和队列 栈和队列都是动态集合,元素的出入是规定好的。栈规定元素是先进后 阅读全文

posted @ 2018-02-25 12:38 AlanTu 阅读(399) 评论(0) 推荐(0)

《算法导论》读书笔记(三)

摘要: 《算法导论》读书笔记之第7章 快速排序 本章介绍了快速排序及其算法分析,快速排序采用的是分治算法思想,对包含n个数的输入数组,最坏情况下运行时间为θ(n^2),但是平均性能相当好,期望的运行时间为θ(nlgn)。另外快速排序能够就地排序(我理解是不需要引入额外的辅助空间,每次划分能确定一个元素的具体 阅读全文

posted @ 2018-02-25 12:29 AlanTu 阅读(396) 评论(0) 推荐(0)

《算法导论》读书笔记(二)

摘要: 《算法导论》读书笔记之第6章 堆排序 本章开始介绍了堆的基本概念,然后引入最大堆和最小堆的概念。全章采用最大堆来介绍堆的操作,两个重要的操作是调整最大堆和创建最大堆,接着着两个操作引进了堆排序,最后介绍了采用堆实现优先级队列。 1、堆 堆给人的感觉是一个二叉树,但是其本质是一种数组对象,因为对堆进行 阅读全文

posted @ 2018-02-25 12:24 AlanTu 阅读(472) 评论(0) 推荐(0)

《算法导论》读书笔记(一)

摘要: 《算法导论》读书笔记之第1章 算法在计算机中的作用 本章是本书的开篇,介绍了什么是算法,为什么要学习算法,算法在计算机中的地位及作用。 算法(algorithm)简单来说就是定义良好的计算机过程,它取一个或一组值作为输入,并产生出一个或一组值作为输出。即算法就是一系列的计算步骤,用来将输入数据转换成 阅读全文

posted @ 2018-02-25 12:20 AlanTu 阅读(2356) 评论(0) 推荐(0)

Posix消息队列

摘要: 消息队列可以认为是一个消息链表,某个进程往一个消息队列中写入消息之前,不需要另外某个进程在该队列上等待消息的达到,这一点与管道和FIFO相反。Posix消息队列与System V消息队列的区别如下:1. 对Posix消息队列的读总是返回最高优先级的最早消息,对System V消息队列的读则可以返回任 阅读全文

posted @ 2018-02-25 11:50 AlanTu 阅读(271) 评论(0) 推荐(0)

管道和FIFO

摘要: 管道(pipe) 管道在Unix及Linux进程间通信是最基础的,很容易理解。管道就像一个自来水管,一端注入水,一端放出水,水只能在一个方向上流动,而不能双向流动。管道是典型的单向通信,即计算机网络中所说的“半双工”。管道又名匿名管道,所以只能用在具有公共祖先的进程之间使用,通常使用在父子进程之间通 阅读全文

posted @ 2018-02-25 11:46 AlanTu 阅读(225) 评论(0) 推荐(0)

linux内核数据结构之kfifo

摘要: 1、前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的。缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度。例如一个进程A产生数据发给另外一个进程B,进程B需要对进程A传的数据进行处理并写入文件,如果B没有处理完,则A要延迟 阅读全文

posted @ 2018-02-25 11:42 AlanTu 阅读(848) 评论(0) 推荐(0)

linux内核数据结构之链表

摘要: 1、前言 最近写代码需用到链表结构,正好公共库有关于链表的。第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域。后来看代码注释发现该代码来自linux内核,在linux源代码下include/Lish.h下。这个链表具备通用性,使用非常方便。只需要在结构定义一个 阅读全文

posted @ 2018-02-25 11:28 AlanTu 阅读(3251) 评论(0) 推荐(0)

linux下core dump

摘要: 1、前言 一直在从事linux下后台开发,经常与core文件打交道。还记得刚开始从事linux下开发时,程序突然崩溃了,也没有任何日志。我不知所措,同事叫我看看core,我却问什么是core,怎么看。同事鄙视的眼神,我依然在目。后来学会了从core文件中分析原因,通过gdb看出程序挂再哪里,分析前后 阅读全文

posted @ 2018-02-25 11:14 AlanTu 阅读(13266) 评论(0) 推荐(0)

RCU介绍

摘要: RCU原理: RCU(Read-Copy Update),顾名思义就是读-拷贝修改,它是基于其原理命名的。对于被RCU保护的共享数据结构,读者不需要获得任何锁就可以访问它,但写者在访问它时首先拷贝一个副本,然后对副本进行修改,最后使用一个回调(callback)机制在适当的时机把指向原来数据的指针重 阅读全文

posted @ 2018-02-25 11:11 AlanTu 阅读(2428) 评论(0) 推荐(0)

采用dlopen、dlsym、dlclose加载动态链接库

摘要: 1、前言 为了使程序方便扩展,具备通用性,可以采用插件形式。采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件。linux提供了加载和处理动态链接库的系统调用,非常方便。本文先从使用上进行总结,涉及到基本的操作方法,关于动态链接库的本质及如何加载进来,需 阅读全文

posted @ 2018-02-25 10:56 AlanTu 阅读(2703) 评论(0) 推荐(0)

linux获取系统启动时间

摘要: 1、前言 时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同。linux内核里面用一个名为jiffes的常量来计算时间戳。应用层有time、getdaytime等函数。今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间 阅读全文

posted @ 2018-02-25 10:20 AlanTu 阅读(2677) 评论(0) 推荐(0)

Linux获取进程执行时间

摘要: 1、前言 测试一个程序的执行时间,时间包括用户CPU时间、系统CPU时间、时钟时间。之前获取之前时间都是在程序的main函数用time函数实现,这个只能粗略的计算程序的执行时间,不能准确的获取其他时间。在看《APUE》时,书中有关程序时间测试程序,非常正规,提供这三个时间。如是,上网搜了一下,进行总 阅读全文

posted @ 2018-02-25 10:08 AlanTu 阅读(12806) 评论(0) 推荐(0)

linux下获取硬盘使用情况

摘要: 1、前言 在嵌入式设备中,硬盘空间非常有限,在涉及到经常写日志的进程时候,需要考虑日志的大小和删除,不然很快就硬盘写满,导致日志程序崩溃。为了捕获硬盘写满的异常场景,我们需要在写日志过程中判断硬盘空间的使用情况,根据硬盘的使用情况,就可以判断是否写满了。如果将要写满了,就给出警告。这样就可以避免程序 阅读全文

posted @ 2018-02-25 10:04 AlanTu 阅读(2257) 评论(0) 推荐(0)

linux下判断文件和目录是否存在

摘要: 1、前言 工作中涉及到文件系统,有时候需要判断文件和目录是否存在。我结合APUE第四章文件和目录,总结一下如何正确判断文件和目录是否存在,方便以后查询。 2、stat系列函数 stat函数用来返回与文件有关的结构信息。stat系列函数有三种情况,分别对应文件名称、文件描述符和符号链接文件。stat结 阅读全文

posted @ 2018-02-25 09:59 AlanTu 阅读(31054) 评论(1) 推荐(0)

孤儿进程与僵尸进程

摘要: 1、前言 之前在看《unix环境高级编程》第八章进程时候,提到孤儿进程和僵尸进程,一直对这两个概念比较模糊。今天被人问到什么是孤儿进程和僵尸进程,会带来什么问题,怎么解决,我只停留在概念上面,没有深入,倍感惭愧。晚上回来google了一下,再次参考APUE,认真总结一下,加深理解。 2、基本概念 我 阅读全文

posted @ 2018-02-25 09:58 AlanTu 阅读(650) 评论(0) 推荐(0)

多个文件目录下Makefile的写法

摘要: 1、前言 目前从事于linux下程序开发,涉及到多个文件,多个目录,这时候编译文件的任务量比较大,需要写Makefile。关于Makefile的详细内容可以参考网上流传非常广泛的《跟我一起写Makefile》http://blog.csdn.net/haoel/article/details/288 阅读全文

posted @ 2018-02-25 09:48 AlanTu 阅读(3117) 评论(0) 推荐(0)

System V 共享内存区

摘要: 1、概述 系统调用mmap通过映射一个普通文件实现共享内存。System V 则是通过映射特殊文件系统shm中的文件实现进程间的共享内存通信。也就是说,每个共享内存区域对应特殊文件系统shm中的一个文件。执行过程是先调用shmget,再调用shmat。对于每个共享的内存区,内核维护如下的信息结构,定 阅读全文

posted @ 2018-02-25 09:35 AlanTu 阅读(325) 评论(0) 推荐(0)

共享内存

摘要: 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。 采用共享内存通 阅读全文

posted @ 2018-02-25 09:32 AlanTu 阅读(480) 评论(0) 推荐(0)

Posix共享内存区

摘要: 1、概述 Posix提供了两种在无亲缘关系进程间共享内存区的方法: (1)内存映射文件:先有open函数打开,然后调用mmap函数把得到的描述符映射到当前进程地址空间中的一个文件(上一篇笔记所用到的就是)。 (2)共享内存区对象:先有shm_open打开一个Posix IPC名字(也可以是文件系统中 阅读全文

posted @ 2018-02-25 09:32 AlanTu 阅读(356) 评论(0) 推荐(0)

Posix信号量

摘要: 1、概述 信号量(semaphore)是一种用于提供不同进程间或一个给定进程的不同线程间同步手段的原语。信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中, 阅读全文

posted @ 2018-02-25 09:30 AlanTu 阅读(391) 评论(0) 推荐(0)

System V 信号量

摘要: System V 信号量在内核中维护,其中包括二值信号量 、计数信号量、计数信号量集。二值信号量 : 其值只有0、1 两种选择,0表示资源被锁,1表示资源可用;计数信号量:其值在0 和某个限定值之间,不限定资源数只在0 1 之间;计数信号量集 :多个信号量的集合组成信号量集内核维护的信号量集结构信息 阅读全文

posted @ 2018-02-25 09:30 AlanTu 阅读(343) 评论(0) 推荐(0)

记录锁

摘要: 1、概述 记录锁是读写锁的一种扩展类型,可用于亲缘关系或无亲缘关系的进程之间共享某个文件的读与写。被锁住的文件通过文件描述符进行访问,执行上锁的操作函数是fcntl,这种类型的锁通常在内核中维护。 记录锁的功能是:一个进程正在读或修改文件的某个部分时,可以阻止其他进程修改同一文件区,即其锁定的是文件 阅读全文

posted @ 2018-02-25 09:26 AlanTu 阅读(694) 评论(0) 推荐(0)

导航