- 博客(63)
- 收藏
- 关注
原创 c++--学习笔记
1、c++编译链接模型 2、c++二进制兼容性问题 3、c++值语义和对象语义区别 4、c++ 数据对象ADT 5、闭包 6、RVO和NRVO优化 7、boost::noncopyable 8、boost::asio 9、对象 拷贝复制构造 问题
2017-06-13 16:42:29
506
转载 boost::circular_buffer的push_back简单分析
circular_buffer为了效率考虑,使用了连续内存块保存元素 使用固定内存,没有隐式或者非期望的内存分配 快速在circular_buffer头或者尾部插入,删除元素,并且是常量时间复杂度 常量时间访问元素 适合实时和对性能要求苛刻的应用 可能适用的场景 可存储最新接收到的samples,当更新的samples到来,覆写最老的元素 可用作底层容器实现固定大小buffer 可作
2017-06-12 10:16:04
1150
原创 智能指针boost::weak_ptr 详解
1、boost::weak_ptr简介 boost::weak_ptr属于boost库,定义在namespace boost中,包含头文件 #include<boost/weak_ptr.hpp>便可以使用。 2、boost::weak_ptr详解 智能指针boost::scope_ptr和智能指针boost::shared_ptr就完全可以解决所有单个对象内存的管理问题。 这儿咋还多出一个
2017-06-12 10:14:19
720
转载 linux服务器之间传输文件的四种方式
转自:http://www.jb51.net/article/82608.htm本文为大家分享了linux服务器之间传输文件的四种方式,供大家参考,具体内容如下 1. scp 【优点】简单方便,安全可靠;支持限速参数 【缺点】不支持排除目录 【用法】 scp就是secure copy,是用来进行远程文件拷贝的。数据传输使用 ssh,并且和ssh 使用相同的认证方式,提供相同的安全保证 。
2017-06-08 11:58:22
38655
转载 c++-头文件编译
转自:http://blog.csdn.net/walker19900515/article/details/46442777 一、C++编译模式通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称作C++头文件,里面放的也是C++的源代码。C+ +语言支持“分别编译”(separate compil
2017-05-04 13:40:20
837
原创 muduo源码分析--线程池的实现
muduo线程池主要有3个类的实现:EventLoop,EventLoopThreadPool,EventLoopThread,和Thread. 1.Thread为对一个线程的封装:class Thread : boost::noncopyable{ public: typedef boost::function<void ()> ThreadFunc; //创建线程时,传递的函数
2017-04-25 10:39:43
796
原创 linux多线程编程关键字:__thread,__bulitin_expect
最近读代码的时候,看到有__thread这个东西,查了一下资料。表示为每个线程声明这样一个变量,并且线程与线程之间的这个变量毫无关联。__thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比。__thread变量每一个线程有一份独立实体,各个线程的值互不干扰。可以用来修饰那些带有全局性且值可能变,但是又不值得用全局变量保护的变量。 __thread使用规则:只能修饰PO
2017-04-18 15:53:38
728
原创 linux-muduo线程通信eventfd
eventfd 在内核版本,2.6.22以后有效。查看内核版本可以用命令 uname -r 在看muduo源码时,项目中使用eventfd机制实现线程间的唤醒(通知)。觉得效率比较高,所以拿来学习下。其也可以实现父子进程间的通信。 首先使用: man eventfd name:eventfd–创建一个用于事件通知的描述符SYNOPSIS:#include<sys/eventfd.h> in
2017-04-17 20:47:30
1522
原创 muduo-源码分析2:注册监听socket和建立连接
阅读库源码时可以从库的接口层着手,看看关键功能是如何实现的。对于muduo而言,可以从TcpServer/TcpClient/EventLoop/TcpConnection这几个类着手。 首先理解muduo如何注册监听socket建立连接,其函数调用时序图如图:
2017-04-11 17:18:01
399
原创 muduo源码分析2:整体框架
muduo简化类图: Channel 是selectable IO channel,负责注册与响应IO 事件,注意它不拥有file descriptor。它是Acceptor、Connector、EventLoop、TimerQueue、TcpConnection 的成员,生命期由后者控制。 Socket 是一个RAII handle,封装一个file descriptor,并在析构
2017-04-11 16:16:37
545
原创 muduo-源码分析 1:基础概念准备
一 网络模型-Reactor模式 1.什么是reator模式 Wikipedia上说:“The reactor design pattern is an event handling pattern for handling service requests delivered concurrently by one or more inputs. The service handler
2017-04-11 16:04:44
749
原创 muduo-源码分析(前言0)
前言0 个人高性能、高并发linux服务器端编程(网络编程)比较感兴趣,自己写过一些简单的tcp通信程序,用进程池实现简单CGI服务器,用线程池实现简单web服务器。熟悉c++编程语言,但是没有用c++参与过一个项目,所以想寻找一个开源项目,用c++自己实现一个相对完整的网络库,所以选择了muduo开源网络库作为学习的第一个系统。因为他的代码量比较小,书中提到了如何借助现成库来发挥C++的
2017-04-11 15:41:15
439
原创 c++--Singleton单例模式的实现
1.线程安全的懒汉单例模式 懒汉式的特点是延迟加载,比如配置文件,采用懒汉式的方法,顾名思义,懒汉么,很懒的,配置文件的实例直到用到的时候才会加载。。。。。。class Singleton{public: static Singleton& GetInstance(void) { if(m_instance == nullptr) //双重check,实现多线程
2017-04-05 16:25:43
1071
原创 c++--静态成员变量
1.引言 对象的内存中包含了成员变量,不同的对象占用不同的内存,这使得不同对象的成员变量相互独立,它们的值不受其他对象的影响。例如有两个相同类型的对象 a、b,它们都有一个成员变量 m_name,那么修改 a.m_name 的值不会影响 b.m_name 的值。 可是有时候我们希望在多个对象之间共享数据,对象 a 改变了某份数据后对象 b 可以检测到。共享数据的典型使用场景是计数,以Studen
2017-04-05 10:51:46
359
原创 c++-静态成员函数和非静态成员函数的区别
1.virtual与静态函数 C++中,静态成员函数不能被声明为virtual函数。 例如,下面的程序会编译失败。#include<iostream> class Test { public: // 编译错误:static成员函数不能声明为virtual virtual static void fun() { } }; 同样地,静态
2017-04-05 10:28:07
8676
转载 9个offer,12家公司
转载自:到该找工作的时候了,今天辉爷给推荐了一篇牛人写的牛文,看完以后顿时觉得跟跟人家不是能量级的,感觉咱就是一线性的,人家整个一个NP hard~果断转载,在以后这一段找工作的日子里,看着这篇文章,每天鞭策自己!!!1, 简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾。 首先说说我拿到的offer情况:1) 微软,3面->终面,搞定(+1)2) 百度
2017-03-29 15:36:28
1996
原创 深度理解IO模型-同步异步,阻塞非阻塞
一、基础知识: 我们都知道linux将所有的设备都看作文件,那么我们对linux的设备操作都可以看做是文件操作.我们打开一个文件的时候内核会返回给我们一个文件描述符,那么我们对文件的操作都是文件描述符来操作的. 系统调用是如何完成IO操作的呢?网上有一个系列文章讲解一次IO操作的真实过程<一个IO的传奇一生>. linux将内存分为内核区,用户区; linux内核给我们管理
2017-03-26 17:31:54
514
原创 linux-编译和添加库和头文件路劲
一、创建动态库和静态库 从源代码到可执行程序,通常要经过最重要的两大步是:编译,链接。编译就是将源文件生成中间文件的过程,在linux下就是生成 .obj 文件。链接就是用链接器将,这些个中间文件有序地”糅合“在一起,构成一个可执行文件。通常,一个.c文件或者.cpp源文件编译后,就会对应生成一个.obj文件。 那么库文件是什么东西呢?其实库文件就是将这些中间文件.obj进
2017-03-05 16:44:38
2031
转载 TCP/IP协议--拥塞避免
为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制。最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion avoidance)”组成,后来TCP Reno版本中又针对性的加入了“快速重传(Fast retransmit)”、“快速恢复(Fast Recovery)”算法,再后来在TCP NewReno中又对
2017-02-26 15:42:55
1391
转载 TCP协议疑难杂症全景解析
转自:http://blog.csdn.net/dog250/article/details/6612496 说明: 1).本文以TCP的发展历程解析容易引起混淆,误会的方方面面 2).本文不会贴大量的源码,大多数是以文字形式描述,我相信文字看起来是要比代码更轻松的 3).针对对象:对TCP已经有了全面了解的人。因为本文不会解析TCP头里面的每一个字段或者3次握手的细节,也不会解释慢启动和快
2017-02-23 23:08:07
288
原创 c++:_attribute_ 使用:
GNU C的一大特色(却不被初学者所知)就是attribute机制。attribute可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。 attribute书写特征是:attribute前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的attribute参数。 attribut
2017-02-13 15:17:18
11248
2
转载 使用GDB程序调试从初级到高级(七)
转自:http://blog.csdn.net/haoel/article/details/2885 改变程序的执行 ———————一旦使用GDB挂上被调试程序,当程序运行起来后,你可以根据自己的调试思路来动态地在GDB中更改当前被调试程序的运行线路或是其变量的值,这个强大的功能能够让你更好的调试你的程序,比如,你可以在程序的一次运行中走遍程序的所有分支。一、修改变量值修改被调试程序运行时的变
2017-02-08 19:47:30
335
转载 使用GDB程序调试从初级到高级(六)
转自:http://blog.csdn.net/haoel/article/details/2884 七、设置显示选项GDB中关于显示的选项比较多,这里我只例举大多数常用的选项。set print address set print address on 打开地址输出,当程序显示函数信息时,GDB会显出函数的参数地址。系统默认为打开的,如: (gdb) f #0 set
2017-02-08 19:43:53
350
转载 GDB程序调试从初级到高级(五)
转自:http://blog.csdn.net/haoel/article/details/2883 查看运行时数据 ———————在你调试程序时,当程序被停住时,你可以使用print命令(简写命令为p),或是同义命令inspect来查看当前程序的运行数据。print命令的格式是:print <expr>print /<f> <expr> <expr>是表达式,是你所调试的程序的语言的
2017-02-08 19:41:32
258
转载 GDB程序调试从初级到高级(四)
转自:http://blog.csdn.net/haoel/article/details/2882 查看栈信息 —————当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入“栈”(Stack)中。你可以用GDB命令来查看当前的栈中的信息。下面是一些查看函数调用栈信息的GDB命令: backtrace
2017-02-08 19:36:26
260
转载 GDB程序调试从初级到高级(三)
转自:http://blog.csdn.net/haoel/article/details/2881 四、维护停止点上面说了如何设置程序的停止点,GDB中的停止点也就是上述的三类。在GDB中,如果你觉得已定义好的停止点没有用了,你可以使用delete、clear、disable、enable这几个命令来进行维护。 clear 清除所有的已定义的停止点。 clear <f
2017-02-08 19:32:21
364
转载 GDB程序调试从初级到高级(二)
转自:http://blog.csdn.net/haoel/article/details/2880 GDB的命令概貌 ——————— 启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示:/home/hchen> gdb GNU gdb 5.1.1 Copyright 2002 Free Softw
2017-02-08 19:16:42
261
转载 GDB程序调试从初级到高级(一)
转自:http://blog.csdn.net/haoel/article/details/2879用GDB调试程序 GDB概述 ———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有
2017-02-08 19:12:10
265
转载 Linux下一个简单守护进程的实现 (Daemon)
转自:Cise.ufl.edu/~sahni/ 在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程)。守护进程是脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,脱离终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的中断信息所终止。创建守护进程的一般步骤:(1) 创建子进程,退出父进程 为了脱离控制
2017-02-07 20:41:35
1845
转载 C++编译期多态与运行期多态
今日的C++不再是个单纯的“带类的C”语言,它已经发展成为一个多种次语言所组成的语言集合,其中泛型编程与基于它的STL是C++发展中最为出彩的那部分。在面向对象C++编程中,多态是OO三大特性之一,这种多态称为运行期多态,也称为动态多态;在泛型编程中,多态基于template(模板)的具现化与函数的重载解析,这种多态在编译期进行,因此称为编译期多态或静态多态。在本文中,我们将了解:什么是运行期多态
2017-01-03 14:35:18
242
转载 C++中std::tr1::function和bind 组件的使用
[zz]C++中std::tr1::function和bind 组件的使用 - zaleilynn - 博客园 zaleilynn 博客园首页新随笔联系订阅管理 随笔 - 442 文章 - 0 评论 - 12 </div><!--end: blogStats --></di
2016-12-31 16:12:58
751
2
转载 C++中tr1::function和bind 组件的使用
摘自:http://www.cnblogs.com/zhangzhang/archive/2012/03/21/2409164.html为什么要使用? 它们可以实现类似函数指针的功能,却比函数指针更加灵活(体现在占位符上面),尤其是在很多成员调用同一个函数(仅仅是参数类型不同)的时候比较方便 这个是函数指针做不到的要注意的地方: 使用的时候一定要注意指向的是没有this指针的函数(全局函数或静态成
2016-12-31 16:08:26
636
2
转载 c++ explicit在构造函数中的应用
explicit的主要用法就是放在单参数的构造函数中,防止隐式转换, 导致函数的入口参数, 出现歧义. 如果可以使用A构造B, 未加explicit的构造函数, 当使用B进行参数处理时, 就可以使用A, 使得接口混乱. 为了避免这种情况, 使用explicit避免隐式构造, 只能通过显示(explicit)构造. 下面是代码, 仔细阅读必有收获, 可以试着删除explicit, 调用注释的语句
2016-12-30 15:24:03
277
转载 (转)遵循placement new的用法规范
标准的开始由一个特别的操作符new来定义,这个就是我们熟知的placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如:Widget * p = new Widget; //ordinary new //普通的new pi = new (ptr) int; pi = new (ptr) int; //placement new括号里的参数是一个指针,它指向一个内存缓
2016-12-29 14:59:28
344
转载 c++-const_cast 使用
C++提供了四个转换运算符: const_cast (expression) static_cast (expression) reinterpret_cast (expression) dynamic_cast (expression)一、const_cast (expression) const_cast转换符是用来移除变量的const或volatile限定符。 1.1**用
2016-12-26 15:47:44
2999
1
原创 inline函数和#define 宏 c/c++
c程序中,可以用宏代码提高执行效率。宏代码本身不是函数,但使用起来像函数,编译预处理器会拷贝宏代码的执行方式取代函数调用,省去了参数压栈、生成汇编语言的CALL调用、参数返回、执行return 等过程,从而提高了速度。使用宏代码的最大缺点是容易出错,预处理器在拷贝宏代码时常常产生意想不到的边际效应,例如: #define MAX(a,b) (a)>(b)?(a):(b) result = MAX
2016-12-26 13:27:44
305
转载 c/c++ static关键字总结
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 1.面向过程设计中的static 1.1 static 声明的变量在C语言中有两方面的特征: 1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的
2016-12-26 11:36:09
295
转载 机器计数-原码, 反码, 补码 (详解)
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带
2016-12-23 19:51:49
1505
转载 c++ const 全面总结!
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。 Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。一、Const作用 如下表所示: 二、Const的使用 1、定义常量 (1)const修饰变量,以下两
2016-12-23 11:08:37
20539
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人