- 博客(45)
- 收藏
- 关注
原创 c++ poco 智能指针AutoPtr 源码剖析
对于C和C++来说,堆上内存的管理是交由程序员完成的,程序员如果在堆上分配了一块内存,就必须负责释放掉。如果不小心,就会造成内存泄露。因此所有 C/C++程序员设计程序时,对指针和内存的管理都会如履薄冰,非常的小心。C++中智能指针,如C++11中的shared_ptr等。通过把堆上对象的委托给智能指针(智能指针本身可以看成是一个栈对象),并在智能指针内部实现引用计数,当引用计数为0时,删除堆对象...
2019-03-11 09:54:14 1004
原创 linux多线程编程学习笔记(2)
1)互斥锁(互斥访问,间接制约关系)1.1)原理互斥锁以排他方式防止共享数据被并发访问。互斥锁是一个二元变量,其状态为开锁(允许0)和上锁(禁止1),将某个共享数据资源与某个特定互斥锁在逻辑上绑定。(1)在访问该资源前,首先申请该互斥锁,如果该互斥锁处于开锁状态,则申请到该锁对象,并立即占有该锁(使该锁处于锁定状态),以防止其它线程访问该资源;如果该互斥锁处于锁定状态,默认阻塞当前进程。(...
2019-03-13 10:10:53 264
原创 c++ stl 内存基本处理工具(与construct()、destroy()并列)
from <stl_uninitialized>1.1 uninitialized_copy()template <class InputIterator, class ForwardIterator>ForwardIterator uninitialized_copy(InputIterator first, InputIterator last, ForwardI...
2019-02-18 17:57:23 1887
原创 os-虚拟内存管理(请求分页存储管理方式)
文章目录1.1 虚拟存储器的定义1.2 虚拟存储器的特征1.3 虚拟内存技术的实现1.4 请求分页管理方式1.4.1 页表机制1.4.2 缺页中断机构1.4.3 地址变换机构1.5 页面置换算法1.6 页面分配策略1.6.1 驻留集大小1.6.2 调入页面的时机1.6.3 从何处调入页面1.1 虚拟存储器的定义基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而将其余部分留在外存,就可...
2019-02-14 21:17:05 3366
原创 c++ stl 迭代器iterators(traits编程技法)
文章目录1.1 迭代器设计思维-stl关键所在1.2 迭代器是一种smart pointer1.3 迭代器相应型别(associated types)1.4 traits编程技法-stl源代码门匙1.4.1 value type1.4.2 different type1.4.3 reference type1.4.4 pointer type1.4.5 iterator_category1.5 s...
2019-02-10 15:30:15 1255
原创 os-内存管理(基本分页存储管理方式)
文章目录1.1 内存管理1.2 内存管理的功能1.3非连续配置管理方式1.3.1 基本分页存储管理方式1.3.1.1 分页存储的几个基本概念1.3.1.2 基本地址变换机构1.3.1.3 具有快表的地址变换机构1.3.1.4 两级页表1.3.2 基本分段存储管理方式1.3.2.1 分段存储的几个基本概念1.3.2.2 地址变换机构1.3.2.3 段的共享与保护1.3.3 段页式管理方式1.1 内...
2019-02-09 16:34:18 1264
原创 c++ stl allocator(具备次配置力sub-allocation)
1.1 alloc(具备次配置力sub-allocation的sgi空间配置器)sgi stl的每一个容器都已经指定其缺省的空间配置器为alloc。例如:template<class T,class Alloc = alloc>class vector{ ... };1.2 sgi特殊的空间配置器std::alloc内存配置操作由alloc:
2019-01-25 20:52:29 799 1
原创 linux多线程编程学习笔记(1)
1)系统调用1.1)创建线程int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);(1)第一个参数用来存储线程ID,参数为指向线程ID的指针,线程的ID在某个进程中是唯一的。如果创建成功,在此参数中返回新线程ID;如果设置为NULL,...
2018-03-07 15:46:15 292
转载 c++ 编程思想 RAII
在C语言中,资源管理是一个极为繁琐易错的工作,大多复杂的C系统都面临着内存泄露、悬挂指针等问题。这是一方面是由底层语言的特点决定;另一方面也是由于C语言特性相对较少,严重依赖程序员进行正确的资源管理,缺乏有效的支持手段。 C#和C++两门语言的定位不同,它们在资源管理方面采取了两种截然不同的方式:一为GC,一为RAII。GC让程序建立在更高的抽象层次上,使资源管理变得更方便,更安全;而C++...
2018-02-26 10:47:44 401
原创 c++ stl queue(FIFO,容器配接器)
1.queue queue是一种先进先出的数据结构,它有两个出口。queue允许新增元素、移除元素、从最底端加入元素、取得最顶端元素。但除了最底端可以加入、最顶端可以取出外,没有任何其他方法可以存取queue的其它元素。换言之,queue不允许有遍历行为。 将元素推入queue的操作称为push,将元素推出queue的操作称为pop。 以某种既有容器为底部结构,将其接口改变...
2018-02-05 10:08:22 2326
原创 c++ stl stack(FILO,容器配接器)
1.stack stack是一种先进后出的数据结构,它只有一个出口。stack允许新增元素、移除元素、取得最顶元素。但除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。 以某种既有容器作为底层结构,将其接口改变,使之符合“先进后出”的特性,形成一个stack,是很容易做到的。deque是双向开口的数据结构,若以deque为底部结构并封...
2018-01-29 10:32:48 460
原创 c++ stl deque(双向开口的分段连续线性空间)
1.deque vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作。vector当然也可以在头尾两端进行操作,但是其头部操作效率奇差,无法被接受。 deque和vector的最大差异,一在于deque允许于常数时间内对起头端进行元素的插入或移除操作,二在于deque没有所谓容量capacity...
2018-01-27 20:48:03 763
原创 c++ stl list(环状双向链表)
1.list 相较于vector的连续线性空间,list就显得复杂很多,它的好处是每次插入或删除一个元素,就配置或释放一个元素的空间。因此,list对空间的运用有绝对的精确,一点也不浪费。而且,对于任何位置的元素插入和元素移除,list永远是常数时间。 list的节点结构:template <class T>struct __list_node{ type...
2018-01-09 10:32:36 5370
原创 c++ stl vector(针对扩充空间策略)
1.vector vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,vector的运用对内存的合理利用与运用的灵活性有很大的帮助。vector的实现技术,关键在于对其大小的控制以及重新配置时的数据移动效率。2.函数成员2.1构造函数:/// Cre...
2018-01-04 17:29:08 2400 1
原创 c++ poco Mutex相关 源码剖析
1.概述 锁机制是多线程并发情景下一种控制共享资源访问的同步机制。Mutex与FastMutex相似,它们都可以借助ScopedLock模板类来自动地对互斥量进行上锁和解锁。不同的是,Mutex是递归的,这意味着同一个互斥量允许被同一个线程锁定多次;FastMutex是非递归的,这意味着如果同一个线程尝试再次锁定一个已经被锁定的互斥量,将会出现死锁的现象。2.类图 2.1)Mutex私有继承于M
2017-12-17 14:51:44 1430
原创 移植zlog到arm linux
1)移植过程版本:zlog-1.2.71.1)主机linuxcd /home/zlog/ mkdir armzlog tar -xvzf zlog-latest-stable.tar.gz cd zlog-1.2.7-ed0995d0/ make CC=arm-none-linux-gnueabi-gcc make PREFIX=/home/zlog/armzlog/ install c
2017-11-28 16:11:54 2255
转载 单元测试的重要性【转自”至简李云“博客】
本文出自 “至简李云” 博客,http://yunli.blog.51cto.com/831344/168865,作者:李云,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明 单元测试(Unit Test, UT)是一个老生常谈的话题,在对这篇文章进行博客归类时,我还是将其归类为开发技术,尽管其带有测试两个字。如何做单元测试不是我这里想说的,而是业界对其认识的认识及重视是我想指出的。
2017-11-06 21:58:54 820
原创 c++ 类的静态成员
1.概述: 有的时候类需要它的一些成员与类本身直接相关,而不是与类的各个对象保持关联。2.实例:ClassStaticMember.hnamespace NameSpaceForTest{class SimpleClassForTest{public: SimpleClassForTest(); ~SimpleClassForTest(); st
2017-11-06 15:51:24 303
原创 c++ poco Event 源码剖析
1.概述 An Event is a synchronization object that allows one thread to signal one or more other threads that a certain event has happened.Usually, one thread signals an event,while one or more other th
2017-10-25 21:52:06 1359
原创 c++ poco Event测试用例
1.说明 Poco库Event类可以用作线程间的超时判断,linux下内部实现基于线程锁和条件变量机制。2.代码#include <iostream>#include "Poco/Thread.h"#include "Poco/Runnable.h"#include "Poco/Event.h"Poco::Event gEVENT;class SimpleClassOfSetEvent :
2017-10-22 13:25:06 2081
转载 c/c++ 类型限定词volatile
限定词volatile告诉编译器该变量除了可被程序改变以外还可被其他代理改变。典型地,它被用于硬件地址和其他并行运行的程序共享的数据。 例: val1 = x; /* 一些不使用x的代码 */ val2 = x; 一个(优化的)编译器可能注意到您两次使用了x,而没有改变它的值。它将把x临时存储在一个寄存器中。接着,当val2需要x时,可以通过从寄存器而非初始的内存位置中读取该值以节
2017-10-07 11:40:41 467
原创 c++ 派生类和基类之间的特殊关系
1.概述1.基类指针可以在不进行显式类型转换的情况下指向派生类对象 2.基类引用可以在不进行显式类型转换的情况下引用派生类对象2.实例2.1实例一#include namespace SimpleTest{using namespace std;class CParent{public: CParent(); virtual ~CParent(
2017-09-23 22:04:02 1195 1
原创 Connector pattern(基于c++ poco库分析)
说明: 摘录自《Pattern Languages of Program Design 3》中的”Acceptor-Connector pattern”部分。目的: 在服务初始化后,从执行的任务中分离出任务初始化,Connecter模式负责主动服务初始化。硬编码:1.常见的错误陷阱 Gateway(client)可以硬编码成主动初始化服务连接。此外,Gateway的主动连接代码可以在传统的网络
2017-09-09 11:10:30 852
原创 c/c++ #define中#和##运算符的使用
1.在#define中使用参数 函数调用和宏调用之间的重要差异,程序运行时,函数调用把参数的值传递给函数。而编译前,宏调用把参数的语言符号传递给程序。 2.#运算符:利用宏参数创建字符串 如果x是一个宏参数,那么#x可以把参数名转换为相应的字符串,该过程称为字符串化。#include <stdio.h>#define POUT(x) printf("---" #x "---\n")int m
2017-09-03 21:11:07 1384
原创 c/c++ {}代码块的使用
如果在代码块”{}”中定义了变量,则该变量的生存周期和作用域将被限制在该代码块内。代码#include <iostream>class SimpleTestClass{public: SimpleTestClass() { std::cout<<"the SimpleTestClass creates"<<std::endl; } SimpleTe
2017-08-20 22:58:39 13960
原创 c++ poco Connector tcpclient测试用例
1.说明 使用poco net库中connector类(基于Connector Pattern思想),将服务初始化和服务行为分离,对Connector进行简单重构,编写ServiceHandler实现简单业务。主要解决: 1)服务初始化时,连接断开的重连。 2)执行服务业务行为时,连接断开的重连。2.代码SocketConnectorTest.h#ifndef Net_SocketCo
2017-08-19 11:45:41 1842
原创 c++ poco StreamSocket 源码剖析
1.概述 “This class provides an interface to a TCP stream socket.”,StreamSocket类是Socket类的子类,用作TCP客户端。本篇系统环境为linux,欢迎交流和指出问题,转载请标明作者和链接地址http://blog.csdn.net/lz_obj/article/details/75825413。2.类图 关系说明:
2017-07-23 23:04:47 2680
转载 红黑树
1.基本概念二叉树:树状结构,最多只允许两个子节点。 二叉搜索树:二叉树结构,任何节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。 平衡二叉搜索树:二叉搜索树,“平衡”没有任何一个节点深度过大。2.AVL-tree 是一个“加上了额外平衡条件”的二叉树。要求任何节点的左右子树高度相差最多1,保证“对数深度O(logN)”平衡状态。 只要调整“插入点至根
2017-07-15 16:33:03 220
原创 c++ poco StreamSocket tcpclient测试用例
1.代码#include <iostream>#include "Poco/Net/Socket.h"#include "Poco/Net/StreamSocket.h"#include "Poco/Net/ServerSocket.h"#include "Poco/Net/SocketAddress.h"#include "Poco/Net/NetException.h"#includ
2017-04-30 21:55:14 5964
原创 移植nginx+php+sqlite到arm linux(二)
1.概述:本篇文章继上一篇继续讲解nginx+php+sqlite到ARM Linux平台的移植和验证。2.交叉编译依赖库2.1交叉编译zlib下载地址:http://download.csdn.net/detail/b404587/3750737 1.tar -xvzf zlib-1.2.3.tar.gz 2.chmod -Rf 777 zlib-1.2.3 3.cd zlib-1.2.3
2017-03-24 14:27:44 1326
原创 移植nginx+php+sqlite到arm linux(一)
1.概述: 经过一段时间的摸索,终于把Nginx+Php+Sqlite移植到ARM(Linux)的环境中并验证成功。 虚拟机环境:ubuntu 10.04 交叉编译器:arm-linux-gcc-4.5.x ARM硬件平台:ARM9 ARM系统:linux 2.6.x 由于篇幅较多,本篇文章只介绍nginx交叉编译和验证的部分。 2.交叉编译 交叉编译Ngin
2017-03-23 20:01:27 5770
原创 c/c++ int,float,short 大小端转换函数
1.unsigned int(uint32_t)大小端转换函数unsigned int BLEndianUint32(unsigned int value){ return ((value & 0x000000FF) << 24) | ((value & 0x0000FF00) << 8) | ((value & 0x00FF0000) >> 8) | ((value & 0xFF00
2017-03-17 16:07:58 15325
原创 c++ string
基本说明 要想使用标准C++中string类,必须要包含#include<string>,而不是#include<string.h>(字符串处理函数),using std::string/using spacename std; string类是基于下述模版定义的: template<class charT,class traits = char_traits<charT>,class A
2017-03-04 08:57:30 279
转载 字符编码ASCII,Unicode和UTF-8
1.ASCII码(7bits) 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。 上个世纪60年代,美国制定了一套字符编码,
2017-02-11 11:14:00 393
原创 Linux shell之awk(《Linux与Unix shell编程指南》读书笔记)
1.说明 本文参考摘录自《Linux与Unix shell编程指南》2.主要内容 如果要格式化报文或从一个大的文本文件中抽取数据包,那么awk可以完成这些任务。它在文本浏览和数据的熟练使用上性能优异。awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息
2017-01-23 20:10:35 700
原创 Linux shell之grep(《Linux与Unix shell编程指南》读书笔记)
1.说明 本文参考摘录自《Linux与Unix shell编程指南》2. 基本概念(1)grep(全局正则表达式版本)允许对文本文件进行模式查找,如果找到匹配模式,grep打印包含模式的所有行。grep支持基本正则表达式,也支持其扩展集。 一般格式: grep [选项] 基本正则表达式 [文件]//本文的测试用例
2017-01-20 10:49:25 564
原创 Linux shell之正则表达式(《Linux与Unix shell编程指南》读书笔记)
1.说明本文参考摘录自《Linux与Unix shell编程指南》 2.基本概念 当从一个文件或命令输出中抽取或过滤文本时,可以使用正则表达式(RE),正则表达式是一些特殊或不很特殊的字符串模式的集合。 为了抽取或获得信息,我们给出抽取操作应遵守的一些规则。这些规则由一些特殊字符或进行模式匹配操作时使用的元字符组成。也可以使用规则字符作为模式中的一部分进行
2017-01-17 22:05:07 694
转载 linux socket网络编程之epoll
1、基本知识 epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。2、epoll接口在上篇转载的文章中提到了select的
2016-12-07 15:49:32 384 1
转载 linux socket网络编程之select
1.基本概念多路复用方式仍然是以阻塞方式等待文件IO准备好,但其可以同时等待多个文件描述符,如果当前有一个或多个socket有变化,则从阻塞状态返回,转而处理该文件描述符IO操作。IO多路复用适用如下场合:(1)当客户处理多个描述字时(一般是交互式输入和网络套接口),必须使用I/O复用。(2)当一个客户同时处理多个套接口时,而这种情况是可能的,但很少出现。(3)如果一个TCP服务器
2016-12-06 15:56:06 461
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人