
C/C++
文章平均质量分 77
编程小问号
这个作者很懒,什么都没留下…
展开
-
C++ 用libcurl库进行http通讯网络编程
目录索引:一、LibCurl基本编程框架二、一些基本的函数三、curl_easy_setopt函数部分选项介绍四、curl_easy_perform 函数说明(error 状态码)五、libcurl使用的HTTP消息头六、获取http应答头信息七、多线程问题八、什么时候libcurl无法正常工作九、关于密码十、HTTP验证十一、代码示例 1.基本的htt转载 2015-09-11 11:42:24 · 364 阅读 · 0 评论 -
HTTP协议漫谈
简介 园子里已经有不少介绍HTTP的的好文章。对HTTP的一些细节介绍的比较好,所以本篇文章不会对HTTP的细节进行深究,而是从够高和更结构化的角度将HTTP协议的元素进行分类讲解。 HTTP的定义和历史 在一个网络中。传输数据需要面临三个问题: 1.客户端如何知道所求内容的位置? 2.当客户端知道所求内容的位置后,如何获取所转载 2016-11-24 19:00:59 · 555 阅读 · 0 评论 -
stl内存池学习(一)——内存池初认识
最近开始学习内存池技术,《高质量c++/c编程指南》在内存管理的第一句话就是:欢迎进入内存这片雷区,由此可见掌握内存管理对于c++/c程序员的重要性。使用内存池的优点有:降低动态申请内存的次数,提升系统性能,减少内存碎片,增加内存空间使用率。 内存池的分类: 一、不定长内存池:优点:不需要为不同的数据创建不同的内存池,缺点是分配出去的内存池不能回收到池中(?)。代表有a转载 2015-01-30 00:26:53 · 1081 阅读 · 0 评论 -
epoll源码分析(二)
上面的原型是epoll的fd所维护的主结构,下面是每一个具体的fd结构.以后每一个fd加入到epoll中,就会创建一个struct epitem结构,并插入至红黑树中。接着是epoll_ctl函数原型:asmlinkage long sys_epoll_ctl(int epfd,int op,int fd,struct epoll_event _转载 2014-06-24 23:32:54 · 554 阅读 · 0 评论 -
epoll源码分析(一)
当系统启动时,epoll进行初始化:static int __init eventpoll_init(void){ mutex_init(&pmutex); ep_poll_safewake_init(&psw); epi_cache = kmem_cache_create(“eventpoll_epi”,sizeof(st转载 2014-06-24 23:31:06 · 938 阅读 · 0 评论 -
epoll源码分析(三)
epoll_wait系统实现如下:asmlinkage long sys_epoll_wait(int epfd,struct epoll_event __user *events, int maxevents,int timeout){ int error; struct file *file;转载 2014-06-24 23:36:10 · 707 阅读 · 0 评论 -
vector的构造与内存管理
1.vector的数据结构[cpp] view plaincopyprint?template class T, class Alloc = alloc> class vector { ... protected: iterator start; //表示目前已使用空间的头 iterator finish;转载 2014-07-15 17:47:32 · 560 阅读 · 0 评论 -
数值极值
1.引言 在阅读别人的代码的时候,经常遇到最大的int值赋值为0x7FFFFFFF,最小的int值赋值为0x80000000。 最大值易于理解,但是最小值为什么是0x80000000? 首先注意,当给变量按16进制赋值的时候,是按补码形式赋值的。但是有一个特例就是0x80000000,这个是最小的负数,因为负数比正数表示的范围多1,所以0转载 2014-07-15 18:17:01 · 558 阅读 · 0 评论 -
vector clear 内部过程
最近在论坛看到一个提问帖子,问题是vector中存储了对象的指针,调用clear后这些指针如何删除?[cpp] view plaincopyprint?class Test { public: Test() {} ~Test() { cout "Test des" }; int main() { vector vec;转载 2014-07-15 17:49:17 · 1016 阅读 · 0 评论 -
C++强大背后
在31年前(1979年),一名刚获得博士学位的研究员,为了开发一个软件项目发明了一门新编程语言,该研究员名为Bjarne Stroustrup,该门语言则命名为——C with classes,四年后改称为C++。C++是一门通用编程语言,支持多种编程范式,包括过程式、面向对象(object-oriented programming, OP)、泛型(generic programming, G转载 2014-07-15 19:07:00 · 392 阅读 · 0 评论 -
C++程序运行时内存布局之----------this到底是什么?
先问一个问题,在C++里,成员函数里的this指针和调用此函数的对象地址总是一样的吗?如果你的回答是:不一定。那么至少你是个老手吧,下面的内容你就不用看了;如果你的回答是:是啊,那么强烈建议你看看下面的内容。 非静态成员函数,无论是不是虚函数,都隐藏了一个this指针参数。这个参数的目的就是给函数提供一个基地址,以便于函数体内能找到对象的成员变量。那非静态成员函数是如何根据this指针找到转载 2014-07-16 16:32:39 · 481 阅读 · 0 评论 -
Reactor pattern
什么是ReactorReactor又称Dispatcher,用于同步IO,它逆置了常见的函数调用机制,也就是说, Application将一个service对应的handler注册到Reactor,当这个service需要被处理时(一般通过定时器来触发),Reactor主动调用handler.浅白一点说, ‘Don’t call us, we’ll call you.’ —Hollywoo转载 2014-07-17 20:51:56 · 564 阅读 · 0 评论 -
循环队列的队空与队满的条件
为了方便起见,约定:初始化建空队时,令 front=rear=0, 当队空时:front=rear 当队满时:front=rear 亦成立 因此只凭等式front=rear无法判断队空还是队满。 有两种方法处理上述问题: (1)另设一个标志位以区别队列是空还是满。 (2)少用一个元素空间,约定以“队列头指针front在队尾指针rear的下一个位转载 2014-07-19 00:29:15 · 3713 阅读 · 0 评论 -
select、poll、epoll的比较
linux提供了select、poll、epoll接口来实现IO复用,三者的原型如下所示,本文从参数、实现、性能等方面对三者进行对比。 int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);int poll(struct po转载 2014-07-19 00:42:44 · 513 阅读 · 0 评论 -
一道淘汰85%面试者的百度开发者面试题——解题、参考答案和优化思路
一道听说挺考验基本功的淘汰85%的面试者的题目,自己也来试试。题目描述:依序遍历0到100闭区间内所有的正整数,如果该数字能被3整除,则输出该数字及‘*’标记;如果该数字能被5整除,则输出该数字及‘#’标记;如果该数字既能被3整除又能被5整除,则输出该数字及‘*#’标记。之前被考过一个类似的题,不过那个是看一个数是3的多少次幂。就是因为没有提转载 2014-07-19 12:15:00 · 884 阅读 · 1 评论 -
出错处理函数abort、exit、atexit、strerror. . .
摘要:本文详细讲述了几个出错处理的函数abort、exit、atexit、strerror函数的使用方法,并给出来具体的示例程序。 函数名: abort功 能: 异常终止一个进程用 法: void abort(void);头文件:#include 说明:abort函数是一个比较严重的函数,当调用它时,会导致程序异常终止,而转载 2014-07-19 00:38:28 · 555 阅读 · 0 评论 -
c++ 使用json的库
你看到的这个文章来自于http://www.cnblogs.com/ayanmwcJSON官网是:http://sourceforge.net/projects/cjson/?source=recommended 最新版本是2013年的,与2009年的变化不是很大。看了代码,觉得挺好,只是是C语言的,不够好。就改良了一下,内存自己管理。使用std::stri转载 2014-07-19 11:59:46 · 752 阅读 · 0 评论 -
C++类型转换
C++类型转换分为:隐式类型转换和显式类型转换第1部分. 隐式类型转换又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。 int ival = 3;double dval = 3.14159;ival + dval;//转载 2014-07-08 17:06:25 · 357 阅读 · 0 评论 -
pthread_cond_wait 和 pthread_cond_signal
//pthread_cond_signal 只发信号,内部不会解锁,在Linux线程中,有两个队列,分别是cond_wait队列和mutex_lock队列, cond_signal只是让线程从cond_wait队列移到mutex_lock队列,而不用返回到用户空间,不会有性能的损耗。(pthread_cond_signal unlock后pthread_cond_wait才能上锁)转载 2014-07-09 17:20:17 · 364 阅读 · 0 评论 -
new/malloc 区别
malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的转载 2014-07-15 17:23:03 · 359 阅读 · 0 评论 -
C++ 虚函数内存布局学习笔记
由sizeof()求带有虚函数的类的大小引发的思考,在查看相关资料的过程中看到了陈皓先生的一篇文章《C++虚函数表解析》(详情见http://blog.youkuaiyun.com/haoel)觉得讲的十分的好,只是看完之后仍对为什么要又为什么可以由父类的指针调用子类的对象的虚函数不解,如这种典型的描述:Derive d;//Derive是Base的子类Base *b1 = &d;//这必须使转载 2014-10-08 16:09:55 · 460 阅读 · 0 评论 -
g++编译选项
gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件 2.将预处理后的文件不转换成汇编语言,生成文件.s 3.有汇编变为目标代码(机器代码)生成.o的文件 4.连接目标代码,生成可执行程序 [参数详解] -x language filename转载 2014-10-10 18:55:34 · 613 阅读 · 0 评论 -
如何断点调试多线程? .
下面是我的代码: private void menuItem2_Click(object sender, System.EventArgs e) { Thread thread=new Thread(new ThreadStart(this.foo)); thread.Start(); //在这一行转载 2015-01-08 12:56:01 · 3134 阅读 · 0 评论 -
Protocol Buffer技术深入理解(C++实例)
这篇Blog仍然是以Google的官方文档为主线,代码实例则完全取自于我们正在开发的一个Demo项目,通过前一段时间的尝试,感觉这种结合的方式比较有利于培训和内部的技术交流。还是那句话,没有最好的,只有最适合的。我想写Blog也是这一道理吧,不同的技术主题可能需要采用不同的风格。好了,还是让我们尽早切入主题吧。一、生成目标语言代码 下面的命令帮助我们将MyMessage.proto转载 2015-01-26 23:54:40 · 565 阅读 · 0 评论 -
Linux和Windows下Socket句柄(描述符)的分配策略
烽驿2009开源实时通信平台 源码获取:svn checkout http://fy2009.googlecode.com/svn/trunk/ fy2009-read-only 大型通信服务器软件通常需要管理成千上万的连接,为了在底层Socket句柄(Linux上称为描述符)上收到数据时能快速递交给应用层连接对象,实现一种高效的以Socket句柄为Key的连接对象查找算法是绝对必转载 2015-01-08 11:51:51 · 1802 阅读 · 0 评论 -
用C++编写的姓名模糊查找函数
/*求字符串准长度函数用来求一个即包含字母数字又包含文字的字符串的长度(一个中文字只算1个长度)p:接收字符串返回值:字符串的准长度*/int Strlen(char *p){ int len=0; while(*p!='') { len++; (*p>0)?p++:p=p+2; //如果当前的字符的ASCII码为正(指针下移一位),为负(指针下移两位转载 2014-12-26 13:11:30 · 8249 阅读 · 0 评论 -
String中文字符转码
String中文字符转码如何使用String构造方法和String.getBytes()做好中文字符转码 1 @Test 2 public void test() { 3 String testStr = "中"; 4 try { 5 // 得到指定编码的字节数组 字符串--->字节数组 6 byte[]转载 2014-12-26 23:42:30 · 631 阅读 · 0 评论 -
模板特化
对模板特化的理解:特化整体上分为全特化和偏特化,这一点大家都没有什么置疑,但是细分它们各包括哪几种状态就很难界定了,而且很多权威的书上都不一致,管它呢,反正我们能会用各种特化就可以了。下面就谈谈我个人对特化的划分和定义:所谓特化,就是将泛型的东东搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const转载 2015-02-04 21:39:35 · 442 阅读 · 0 评论 -
String.getBytes()方法中的中文编码问题
String的getBytes()方法是得到一个系统默认的编码格式的字节数组getBytes("utf-8") 得到一个UTF-8格式的字节数组把String转换成bytes,各种编码转换成的bytes不同,比如UTF-8每个汉字转成3bytes,而GBK转成2bytes,所以要说明编码方式,否则用缺省编码。都是将一个string类型的字符串转换成byte类型并且存入一个byte转载 2014-12-26 23:37:42 · 6743 阅读 · 0 评论 -
setlocale同mbstowcs函数的关系
setlocale同mbstowcs函数的关系程序中,如果要将ASCII码字符串转换为宽字符(Unicode),可以利用标准C的mbstowcs函数。 然而,这段代码在处理含有汉字的字符串时就会出现问题。比如将: 替换为查看运行结果就会发现,mbstowcs函数将汉字视作两个ASCII字符,这样一个汉字就变成了两个wchar_t。原因是mbstowcs需要我们明确的告转载 2014-12-30 21:53:50 · 1000 阅读 · 0 评论 -
字符串准长度
/*求字符串准长度函数用来求一个即包含字母数字又包含文字的字符串的长度(一个中文字只算1个长度)p:接收字符串返回值:字符串的准长度*/int Strlen(char *p){ int len=0; while(*p!='') { len++; (*p>0)?p++:p=p+2; //如果当前的字符的ASCII码为正(指针下移一位),为负(指针下移两位转载 2014-12-31 16:54:18 · 768 阅读 · 0 评论 -
mbstowcs 和 wcstombs
本文介绍两个由C语言提供的宽字符(wchar_t类型)和多字节字符( 一个字符用一个或者多个字节表示) 转换函数,因此具有通用性(在Windows/Linux系统中都可以使用):所需头文件:stdlib.h#include ( 1 ) mbstowcs()功能:把多字节字符转换成宽字符原型: size_t mbstowcs( wchar_t *wcstr,转载 2014-12-30 21:42:56 · 5806 阅读 · 1 评论 -
Linux下char类型可能带来的问题
问题起因:linux下C++采用utf-8编码方式,因此char类型不是单纯的一个字符一个字节。一个英文字符占一个字节,而一个中文字符则不只占了一个字节(具体查看Unicode编码方案简介及实现一文)。如下所示,分别输出中文的“王子”和其中文拼音的“wangzi”代码:[cpp] view plaincopy"转载 2014-12-30 23:48:08 · 702 阅读 · 0 评论 -
Nginx特点
Nginx特点:1,跨平台:Nginx 可以在大多数 Unix like OS编译运行,而且也有Windows的移植版本。2,配置异常简单:非常容易上手。配置风格跟程序开发一样,神一般的配置。3,非阻塞、高并发连接:数据复制时,磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数.(这得益于Nginx使用了最新的epoll模型)。4,转载 2015-01-03 00:18:37 · 576 阅读 · 0 评论 -
__FILE__显示全路径的问题
在日志中,使用到__FILE__来显示源码的文件名,可它显示了绝对路径,这样使得整个log看起来很长,主要log都显示在了右边,让人看着很是不舒服。查找了半天才知道这是编译造成的,由于编译目录和源码目录不同,所以在实际编译的时候使用的是源码的绝对路径,以致打印出来就是绝对路径了(这样的解释不是很准确,有待改进)。针对这种现象,使用以下的例子作为测试。#include int mai转载 2015-02-17 00:31:17 · 5300 阅读 · 2 评论 -
MarioTCP:一个单机可百万并发长连接服务器
注:如果用此服务器做变长data的传输,请在业务处理函数中为input buffer增加清空功能(一行memset搞定;也可以在mariotcp核心代码mario_network.c的read功能中增加,mariotcp为了追求性能极限没做此设置)。mario_network.c 文件的 on_conn_read()函数中:[cpp] view plainc转载 2015-01-03 00:15:47 · 2866 阅读 · 0 评论 -
boost::noncopyable学习
在学习boost的时候,发现很多类都继承至boost::noncopyable,那么boost::noncopyable这个类是干什么用的呢?原来boost::noncopyable允许程序实现一个禁止复制的类,即不能使用类的复制构造函数和复制赋值操作符。以前在写程序的时候,经常反复实现一个不可复制的类或者单例类,于是经常性的拷贝、粘贴,不时还有一些小错误发生。现在boost::noncopyab转载 2015-01-25 00:23:10 · 827 阅读 · 0 评论 -
隐蔽的内存泄漏——pthread_create 属性设置不当导致
最近解决了一个隐蔽的内存泄漏问题,我们的进程是HA模式,用户不停的切换,会导致内存不停的增长,切换一次,再切回来内存便增加8M左右。原因就是是pthread_create后的僵死线程没有释放导致的内存持续增长。pthread_create (&thread, NULL, &thread_function, NULL); 就这么写了,参数2没有设置线程结束后自动detach,并且没有使用转载 2015-03-25 12:17:39 · 1018 阅读 · 0 评论 -
__FILE__,__LINE__,__DATE__,__TIME__, __FUNCTION__
C++有四个常用的预定义名字,分别为:__FILE__,__LINE__,__DATE__,__TIME____FILE__:记录文件的路径加名称__LINE__:记录文件已经被编译的行数__DATE__:记录文件的编译日期__TIME__:记录文件的编译时间可以当作变量直接使用,一般用作程序调试例子:#include using namespace std;i转载 2015-03-04 15:03:28 · 641 阅读 · 0 评论 -
list_entry()详解
Linux内核中,获取节点地址的函数list_entry()非常常用,由于其定义有点晦涩,先解析如下:list_entry的宏定义:#define list_entry(ptr, type, member) / ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 这个倒是不难理解:从一个转载 2015-03-05 17:52:54 · 460 阅读 · 0 评论