- 博客(65)
- 资源 (3)
- 收藏
- 关注
转载 同步,异步,阻塞,非阻塞
一讲到网络编程的I/O模型,总会涉及到这几个概念。问了很多人,没几个能清晰地讲出他们之间的区别联系,甚至在网络上也有很多不同的观点,也不知是中国文字释义的博大精深,还是本来这几个概念就是绕人不倦。今天我也来给大家讲解一下我对这几个概念的理解。既然网络上众说纷纭,不如找个权威参考一下,这个权威就是《UNIX网络编程:卷一》第六章——I/O复用。书中向我们提及了5种类UNIX下可用的I/O
2017-03-26 19:14:51
552
转载 单例模式(Singleton)及其C++实现
单例模式(Singleton)及其C++实现众多设计模式中,单例模式比较常见的一种,面试和工作中也会经常接触到。本文以一个C++开发者的角度来探讨单例模式几种典型实现。设计模式经典GoF定义的单例模式需要满足以下两个条件:保证一个类只创建一个实例。提供对该实例的全局访问点。如果系统有类似的实体(有且只有一个,且需要全局访问),那么就可以将其实现为一个单例。实际工作中常见的应
2017-02-21 22:45:40
726
转载 UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现
类与类图1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务。一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性和操作(即方法)。3) 类的属性即类的数据职责,类的操作即类的行为
2017-02-14 14:38:23
790
转载 c++ 智能指针用法详解
本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用。为什么要使用智能指针:我们知道c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最
2017-02-13 19:01:38
741
转载 详解大端模式和小端模式
详解大端模式和小端模式嵌入式开发交流群280352802,欢迎加入!一、大端模式和小端模式的起源 关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯
2017-02-08 17:18:56
445
转载 c++ 类中static变量初始化问题
首先static变量只有一次初始化,不管在类中还是在函数中..有这样一个函数:[c-sharp] view plain copy print?void Foo() { static int a=3; // initialize std::cout a++; } 这里的st
2017-01-17 09:49:12
4796
转载 模板显式、隐式实例化和(偏)特化、具体化的详细分析
最近看了看到了模板的特化,突然想起来上说的显式具体化、隐式具体化、特化、偏特化、具体化等概念弄得头晕脑胀,我在网上了找了好多帖子,才把概念给理清楚。 一下是我把再网上找的资料整理一下。 看着这么多叫法,其实就是三种。 1. 显示实例化 2. 隐式实例化 3. 特化(=具体化)、偏特化一、实例化1.显示、隐式实例化
2017-01-06 16:20:38
618
转载 C++模板
C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。 模板是一种对类型进行参数化的工具; 通常有两种形式:函数模板和类模板; 函数模板针对仅参数类型不同的函数; 类模板针对仅数据成员和成员函数类型不同的类。 使用模板的目的就是能够让程序
2017-01-06 11:37:12
385
转载 字符串匹配的KMP算法
字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。这种算法不太容易理解,网上
2016-12-07 14:11:30
446
转载 IO - 同步,异步,阻塞,非阻塞
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不
2016-07-24 11:42:51
392
转载 正则表达式30分钟入门教程
本文目标30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。如何使用本教程最重要的是——请给我30分钟,如果你没有使用正则表达式的经验,请不要试图在30秒内入门——除非你是超人 :)别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有想像中的那么困难。当然,如果你看完了这篇教程之后,发现自己明白
2016-06-17 16:56:44
536
原创 QRegExp一些注意事项(正则表达式和模式匹配)
某些字符代表的非本身意义(即有特殊意义):如:^、-、*等,要表示本身意义时,需要在前面加"\"。某些字符代表其本身意义,但是加上"\"后有特殊意义,如:\n、\r、\t、\v、\a、\f等。qt本身为c++语言,在c++中"\"用来escape(转义),表示其本身是需要转义的,故在一个正则表达式中包含“\”需要在“\\”。(提示:因为c++有定义自己的转义序列,当和qt的相同时只用"
2016-06-17 16:35:54
7237
转载 翻译QSetting的用法
QSetting是一个平台无关的可以设置和读取应用程序设置的类用户可能希望应用程序记住自己应用程序的设置,windows记录在注册表中,mac中记录在xml中,在unix中,缺乏标准,所以很多都记录在.ini文本文件中QSetting的API都是基于QVariant的,允许保存很多类型的数据,例如QString,QRect,和QImage 基本用法:当创建一
2016-06-15 14:55:08
1100
原创 Qt child widget stop inherit parent widget image(Qt子窗体stylesheet不继承父窗体stylesheet)
设置一个Qwidget的背景图片有两种方法
2016-06-15 12:05:10
2899
转载 cthu Qt中mouseMoveEvent无效
最近用Qt软件界面,需要用到mouseMoveEvent,研究了下,发现些问题,分享一下。在Qt中要捕捉鼠标移动事件需要重写MouseMoveEvent,但是MouseMoveEvent为了不太耗资源在默认状态下是要鼠标按下才能捕捉到。要想鼠标不按下时的移动也能捕捉到,需要setMouseTracking(true)。bool mouseTracking这个属性保存的是窗口
2016-06-01 10:13:45
645
原创 单例模式
singleInstance.h#ifndef SINGLEINSTANCE_H_#define SINGLEINSTANCE_H_class SingleInstance{private: SingleInstance();//防止用户类外定义对象 SingleInstance(const SingleInstance& ins);//防止用户用拷贝构造函数拷贝新对象publ
2016-05-05 15:02:41
454
原创 静态库链接、动态库静态链接和动态链接
一、概念1.1、当我们建立一个项目(应用程序)它可以有很多种生成类型(应用程序.exe、动态库.dll、静态库lib),可以在创建向导时指定也可以在配置属性里更改。以vs2010为例,右键点击项目属性->配置属性->右侧配置类型中选择你需要生成的类型。1.2、当项目生成类型是静态库(.lib),程序会生成一个以项目名命名后缀为.lib的静态库文件。而当项目生成类型是动态库(.dll),程序
2016-03-30 15:51:14
1216
转载 回调函数
回调函数 在看LWIP时,见到用回调函数,再看某老外公司OPC源代码时,见到用回调函数。看我国内某些代码(我公司软件等)时没用到。于是,我对回调函数产生了很大的好奇。以前,我写VC程序时用到过回调函数,但是没有用C语言来使用。最近,看到国外大量的经典代码中广泛使用了回调函数(LWIP、某两个公司的OPC程序等),都是C语言来实现的,而不是VC windows程序中别人实现自己使用的那种。
2016-02-17 10:49:56
424
转载 C++的函数重载
——每个现象后面都隐藏一个本质,关键在于我们是否去挖掘写在前面:函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题1、声明/定义重载函数时,是如何解决命名冲突的?(抛开函数重载不谈,using就是一种解决命名冲突的方法,解决命名冲突还有很多其它的方法,这里就不论述了)2、当
2016-01-12 19:52:06
451
转载 Linux的SOCKET编程详解
Linux的SOCKET编程详解1. 网络中进程之间如何通信进 程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如UNIX BSD有:管道(pipe)、命名管道(named pipe)软中断信号(signal)UNIX system V有
2016-01-08 14:37:03
593
转载 从 Qt 的 delete 说开来
在C++中学习过程中,我们都知道:delete 和 new 必须 配对使用(一 一对应):delete少了,则内存泄露,多了麻烦更大。Qt作为C++的库,显然是不会违背C++的前述原则的。可是:在Qt中,我们很多时候都疯狂地用new,却很少用delete,缺少的 delete 去哪儿了?!注:本文暂不涉及智能指针(smart pointer)相关的东西,你可以考虑
2016-01-04 13:48:34
563
转载 This qt version uses an unsupported makefile generator object reference not set to an instance of an
"This qt version uses an unsupported makefile generator (used: ,supported: MSVC.NET, MSBUILD)"解决方法:Run regedit.Hop to HKEY_CURRENT_USER\Software\Trolltech\VersionsAdd a new key named "
2015-12-13 15:09:21
6029
转载 指向函数的指针
可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。用简单的数值比较为例:#include #include int max1(int x,int y){ int z; if(x>y) z = x; else z = y;
2015-10-14 13:09:06
621
原创 lua中pairs 和 ipairs区别
标准库提供了集中迭代器,包括迭代文件每行的(io.lines),迭代table元素的(pairs),迭代数组元素的(ipairs),迭代字符串中单词的 (string.gmatch)等等。LUA手册中对与pairs,ipairs解释如下:pairs(t)Returns three values: the next function, the table t, and n
2015-10-09 12:29:01
669
转载 C++默认参数与函数重载 注意事项
一、默认参数在C++中,可以为参数指定默认值。在函数调用时没有指定与形参相对应的实参时, 就自动使用默认参数。默认参数的语法与使用:(1)在函数声明或定义时,直接对参数赋值。这就是默认参数;(2)在函数调用时,省略部分或全部参数。这时可以用默认参数来代替。注意:(1)默认参数只可在函数声明中设定一次。只有在没有函数声明时,才可以在函数定义中设定。(#add ,此句意为存
2015-10-08 12:06:56
2439
1
转载 C++ 定义实用比较函数(Custom Compare Function) 注意点
学过C++的应该都知道在调用sort算法的时候可以自定义比较函数(map, heap也都有类似的比较函数谓词的定义), 从而实现不同的排序比如可以从小到大或者从大到小,比如如下就是sort函数的申明(摘自cplusplus):template void sort (RandomAccessIterator first, RandomAccessIterator last, Compa
2015-09-25 16:36:33
2235
原创 string类实现
#include #includeusing namespace std;class String{public: String(const char* str="");//通用构造函数 String(const String& another);//拷贝构造函数 ~String();//析构函数 String& operator =(const Stri
2015-09-24 11:14:38
410
转载 局部变量作为返回值
看看下面的程序的输出:#includechar *returnStr(){ char *p="hello world!"; return p;}int main(){ char *str; str=returnStr(); printf("%s\n", str); return 0;}这个没有任何问题,因为"hello
2015-09-22 10:40:03
1402
2
转载 函数后面加const
类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函数前面或者
2015-09-17 18:43:54
444
转载 什么是复合类型
C++中,什么是复合类型?刚开始,还以为自定义的类是复合类型。查了C++ primer才知道复合类型不是类。在C++中类型大致可以分为三种一、内置类型如int, char, float, unsigned等。内置类型是最基本的类型。二、复合类型复合类型:使用其它类型定义的类型。有三种复合类型:引用,指针,数组。三、类类型就是类。比如string以及自己定义的类。
2015-09-17 11:47:46
751
原创 string.h常用函数实现未完待续
#include #include #includeusing namespace std;原型:char* strcpy(char* dest, const char *src);说明:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。c
2015-09-15 18:31:17
708
转载 C++ 拷贝构造函数 赋值构造函数
C++ 拷贝构造函数 赋值构造函数拷贝构造函数和赋值构造函数的异同由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视。请先记住以下的警告,在阅读正文时就会多心:如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String 的两个对象a,b 为例,假设a.m_data
2015-09-15 11:13:31
596
转载 c/c++中delete/free 指针后,设置p=NULL的好处
从简单的代码开始: int* p = new int; *p = 5; delete p; p = NULL;Line4把释放了的指针立即设置为null,我们一般认识到是防止野指针的产生,从而导致程序崩溃。如: int* p = new int; *p = 5; delete p; *p = 12; //这里崩溃
2015-09-15 10:31:27
549
转载 sizeof浅析——求结构体大小
运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char) = 1; sizeof(int) = 4。基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小。 C语言中的构造数据类型有三种:数组、结构体和共用体。 数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个
2015-09-11 23:46:01
445
转载 深入理解c语言——‘\0’ ,‘0’, “0” ,0之间的区别
看来基础还是很重要的,基础不扎实就难以学好c语言,就别说写出高质量的c语言代码了。今天,我就被这个问题折磨的不行了,哈哈,不过现在终于明白了‘\0’ ,‘0’, “0” 之间的区别了。困惑和快乐与你分享! 首先比较一下‘\0’和‘0’的区别。有一个共同点就是它们都是字符,在c语言中,字符是按其所对应的ASCII码来存储的,一个字符占一个字节。请翻开你的ASCII字符集表吧,一般在你的C语言
2015-09-11 21:21:41
509
原创 判断CPU是大端模式还是小端模式
//判断CPU是大端模式还是小端模式#include using namespace std;//1、同一个内存段可以用来存放几种不同类型的成员,//但是在每一瞬间只能存放其中的一种,而不是同时存放几种。//换句话说,每一瞬间只有一个成员起作用,其他的成员不起作用,即不是同时都在存在和起作用。//2、共用体变量中起作用的成员是最后一次存放的成员,在存入一个新成员后,原有成员就失去作用。
2015-09-11 19:53:28
1333
转载 void和void*详解
void关键字的使用规则: 1. 如果函数没有返回值,那么应声明为void类型; 2. 如果函数无参数,那么应声明其参数为void; 3. 如果函数的参数可以是任意类型指针,那么应声明其参数为void * ; 4. void不能代表一个真实的变量;void体现了
2015-09-02 23:27:02
603
转载 C 风格字符串,C++string类,MFC,CString类的区别。
字符串,顾名思义是由字符组成的字符串,在标准C,标准C++,MFC中 字符串这一功能的实现是不相同的,C++完全兼容了C。1. 标准C中的字符串 在标准C中没有string这样的数据类型,C中的字符串是有char类型的字符数组或者char类型的字符指针来实现的。例如: char name[26]="This is a C-style string"; 或者
2015-09-02 14:16:49
863
转载 字符编码笔记:ASCII,Unicode和UTF-8
作者: 阮一峰日期: 2007年10月28日今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料。结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚。下面就是我的笔记,主要用来整理自己的思路。但是,我尽量试图写得通俗易懂,希望能对其他朋友有用。毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知
2015-09-01 15:25:18
540
转载 Late Not Bad 不带感情的学习技术 char [] 到 LPWSTR转换的一个具体应用
背景:1. Unicode环境2. 使用了CTreeCtrl控件 TV_ITEM类型(item) item.pszText变量 问题:定义了一个chartext[31]数组,用来接收选中的TV_ITEM item的item.pszText。然后将该字符数组的值显示给一个statictext 控件。即,显示当前选中的树形目录的item
2015-09-01 14:33:00
526
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人