
C/C++
三十而立90后
90后的天下
展开
-
dlopen、dlsym和dlclose的使用和举例
之前用过这三个函数一直没时间整理一下。今天抽时间整理一下。1、函数简介dlopen基本定义功能:打开一个动态链接库 包含头文件: #include 函数定义: void * dlopen( const char * pathname, int mode ); 函数描述: 在dlopen的()函数以指定模式打开指定的动原创 2016-05-29 21:12:20 · 1001 阅读 · 0 评论 -
C++中的static关键字
C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static1、静态全局变量在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下:[cpp] view plai转载 2016-03-20 21:30:43 · 245 阅读 · 0 评论 -
C++中虚函数工作原理和(虚)继承类的内存占用大小计算
一、虚函数的工作原理 虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table pointer,虚函数表指针)的指针的形式。vptr 指向一个被称为 vtbl(virtual table,虚函数表)的函数指针数组,每一个包含虚函数的类都关联到 vtbl。当一个对象调用了虚函数,实际转载 2016-03-20 21:28:01 · 377 阅读 · 0 评论 -
C++ 虚函数表解析
前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。转载 2016-03-20 20:51:00 · 248 阅读 · 0 评论 -
C/C++函数指针和回调函数
今天讨论下C/C++中的回调函数。 在理解“回调函数”之前,首先讨论下函数指针的概念。函数指针(1)概念:指针是一个变量,是用来指向内存地址的。一个程序运行时,所有和运行相关的物件都是需要加载到内存中,这就决定了程序运行时的任何物件都可以用指针来指向它。函数是存放在内存代码区域内的,它们同样有地址,因此同样可以用指针来存取函数,把这种指向函数入口地址的指针称为函数指转载 2016-03-08 15:29:19 · 331 阅读 · 0 评论 -
epoll的LT和ET的区别
select/epoll的区别select的特点:select 选择句柄的时候,是遍历所有句柄,也就是说句柄有事件响应时,select需要遍历所有句柄才能获取到哪些句柄有事件通知,因此效率是非常低。但是如果连接很少的情况下, select和epoll的LT触发模式相比, 性能上差别不大。这里要多说一句,select支持的句柄数是有限制的, 同时只支持1024个,这个是句柄集合限制的,如原创 2016-03-30 18:20:35 · 357 阅读 · 0 评论 -
printf中几个不常用的格式说明
d,lx,ld,,lu,这几个都是输出32位的hd,hx,hu,这几个都是输出16位数据的,hhd,hhx,hhu,这几个都是输出8位的,lld,llu,llx,这几个都是输出64位的,举例如下:#include void main(){char out;out=0x80;printf("32bit:%d,%lx,%ld,%lu\n",原创 2016-03-30 16:38:00 · 7065 阅读 · 0 评论 -
使用消息队列的 10 个理由
过去几年中,我们一直在使用、构建和宣传消息队列,我们认为它们是很令人敬畏的,这也不是什么秘密。我们相信对任何架构或应用来说,消息队列都是一个至关重要的组件,下面是十个理由:1. 解耦在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息队列在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵转载 2016-03-03 16:25:12 · 679 阅读 · 0 评论 -
最全面的linux信号量解析
信号量一.什么是信号量信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。二.信号量的分类在学习信号量之前,我们必须先知道——Linux提供两种信号量:(1) 内核信号量,由内核控制路径使用(2) 用户态进程转载 2016-03-03 14:28:53 · 561 阅读 · 0 评论 -
epoll详解
什么是epollepoll是什么?按照man手册的说法:是为处理大批量句柄而作了改进的poll。当然,这不是2.6内核才有的,它是在2.5.44内核中被引进的(epoll(4) is a new API introduced in Linux kernel 2.5.44),它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。 ep转载 2016-03-09 14:44:25 · 267 阅读 · 0 评论 -
我读过的最好的epoll讲解--转自”知乎“
首先我们来定义流的概念,一个流可以是文件,socket,pipe等等可以进行I/O操作的内核对象。 不管是文件,还是套接字,还是管道,我们都可以把他们看作流。 之后我们来讨论I/O的操作,通过read,我们可以从流中读入数据;通过write,我们可以往流写入数据。现在假定一个情形,我们需要从流中读数据,但是流中还没有数据,(典型的例子为,客户端要从socket读如数据,转载 2016-03-09 17:38:56 · 465 阅读 · 0 评论 -
protobuf c++ api 简介
1、在.proto文件中定义消息格式2、使用protobuf编译器3、使用c++ api来读写消息0、为何使用protobuf?1、原始内存数据结构,可以以二进制方式sent/saved.这种方式需要相同的内存布局和字节序。2、以ad-hoc方式将数据项编码成一个简单字符串----比如,将4个int类型编码成"12:3:-23:6原创 2016-04-19 13:24:25 · 918 阅读 · 0 评论 -
The Log: What every software engineer should know about real-time data's unifying abstraction
分布式经典文章I joined LinkedIn about six years ago at a particularly interesting time. We were just beginning to run up against the limits of our monolithic, centralized database and needed to sta原创 2016-04-11 18:16:52 · 3045 阅读 · 0 评论 -
STL中map用法详解
快一年多没用了c++,用了好久的c。复习下Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数原创 2016-04-09 21:09:32 · 284 阅读 · 0 评论 -
atexit、exit、return、abort
多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束、在程序的某个地方用exit() 结束程序、用户通过Ctrl+C或Ctrl+break操作来终止程序等等,因此需要有一种与程序退出方式无关的方法来进行程序退出时的必要处理。方法就 是用atexit()函数来注册程序正常终止时要被调用的函数。atexit()函数的参数是一个函数指针,原创 2015-12-17 14:12:58 · 950 阅读 · 0 评论 -
SSL握手过程
一、SSL握手有三个目的:1. 客户端与服务器需要就一组用于保护数据的算法达成一致;2. 它们需要确立一组由那些算法所使用的加密密钥;3. 握手还可以选择对客户端进行认证。二、SSL握手过程:1. 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器;2. 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认转载 2016-04-08 14:36:28 · 372 阅读 · 0 评论 -
类模板学习
1、模板的概念我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。//函数1.int max(int x,int y){ return(x>y)?x:y ; }//函数2.原创 2016-03-15 15:46:40 · 335 阅读 · 0 评论 -
uint8_t / uint16_t / uint32_t /uint64_t
uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?很多人有这样的疑问。论坛上就有人问:以*_t结尾的类型是不是都是long型的?在baidu上查原创 2016-04-07 18:45:17 · 440 阅读 · 0 评论 -
C++11 写个线程池
#ifndef THREAD_POOL_H#define THREAD_POOL_H#include #include #include #include #include #include #include #include #include class ThreadPool {public: ThreadPool(size_t); template原创 2016-03-22 21:39:28 · 731 阅读 · 0 评论 -
多线程 1
这些题的解答可以参考另一个链接:http://blog.youkuaiyun.com/chencheng126/article/details/44652533这篇文章的一些亮点,如:对多线程的同步和互斥的区别,举得例子很清楚。就是生产者和多个消费者之间的关系。生产者和消费者之间是同步,而多个消费者之间是互斥。--------------------------------转载 2016-01-25 16:13:14 · 362 阅读 · 0 评论 -
C/C++编码规范
对于不同的编程语言来说,具体的编码规范可以有很大的不同,但是其宗旨都是一致的,就是保证代码在高质量完成需求的同时具备良好的可读性、可维护性。例如我们可以规定某个项目的C语言程序要遵循这样的规定:变量的命名,头文件的书写和#include 等等。下面是一些广为采用的编码规范: GNU Coding StandardsGuidelines for the Use of the C La翻译 2016-01-24 20:46:10 · 351 阅读 · 0 评论 -
Github 的持续集成小伙伴 Travis
以前在三星工作时接触过持续集成。当时用的OBS。前几天发现 GitHub 也有一个自动集成的工具——Travis.Travis 地址:https://travis-ci.org/1.进入首页,选择 Sign in with Github, 即用 github账号登陆2. 登陆后,选择My Repositories 后的+ , 添加Gith原创 2016-01-24 20:34:15 · 608 阅读 · 0 评论 -
fork 详解(经典收藏)
一、fork入门知识 一个进程,包括代码、数据和分配给进程的资源。fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。 一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来转载 2015-11-02 11:50:33 · 417 阅读 · 0 评论 -
内存对齐问题
结构体和共用体的内存分配是C语言的一个难点,也是面试题中的热点。编译器是按照什么样的原则进行对齐的? 先让我们看四个重要的基本概念:1.数据类型自身的对齐值: 对于char型数据,其自身对齐值为1,对于short型为2,对于int,float类型,其自身对齐值为4,double类型在VC下是8,GCC下是4,单位字节。2.结构体或者类的自身对齐值:其成员转载 2015-11-24 09:58:22 · 347 阅读 · 0 评论 -
STL源码剖析---迭代器失效小结
迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针。但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查看,所占内存并不是4个字节。 首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器转载 2015-11-23 12:38:12 · 265 阅读 · 0 评论 -
typedef struct和struct的区别
好多童鞋不理解 typedef struct和struct的区别。在此说明下:分三块来讲述: 1 首先://注意在C和C++里不同 在C中定义一个结构体类型要用typedef: typedef struct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1;(如果没有typedef就必原创 2015-11-20 18:04:22 · 260 阅读 · 0 评论 -
大型项目使用Automake/Autoconf完成编译配置
大型项目使用Automake/Autoconf完成编译配置使用过开源C/C++项目的同学们都知道,标准的编译过程已经变成了简单的三部曲:configure/make/make install, 使用起来很方便,不像平时自己写代码,要手写一堆复杂的Makefile,而且换个编译环境,Makefile还需要修改(Eclipse也是这样)。 这么好的东东当然要拿来用了,但GNU的Autoto转载 2015-10-26 18:55:45 · 514 阅读 · 0 评论 -
一个简单的执行程序的GNU automake自动生成Makefile的方法及案例
/********************************************************************* * Author : Samson * Date : 01/27/2015 * Test platform: * 3.13.0-24-generic * GNU bash, 4.3.11(转载 2015-10-26 18:50:07 · 363 阅读 · 0 评论 -
cJSON学习笔记2
0.前言 本文试图说明如何使用CJSON构造各种各样的JSON数据包。在前段时间已经写过一篇cJSON的文章,所以本文成为“续集”。 【相关博文】 【前端学习——JSON学习】——学习各种各样的JSON格式 【cJSON学习笔记】——本学习笔记的前一“集”。 【代码仓库】——cJSON-Example转载 2015-08-09 21:35:02 · 532 阅读 · 0 评论 -
cJSON学习笔记1
cJSONyeelinkJSON目录(?)[-]JSON格式简述JSON结构体几点说明解析JSON数据包参考代码运行结果若干说明组装JSON数据包参考代码若干说明总结参考资料1.JSON格式简述JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同转载 2015-08-09 21:33:44 · 582 阅读 · 0 评论 -
float类型在内存中的表示
先说一下计算机中二进制的算法:整数 整数的二进制算法大家应该很熟悉,就是不断的除以2取余数,然后将余数倒序排列。比如求9的二进制: 9/2=4 余 1 4/2=2 余 0 2/2=1 余 0 1/2=0 余 1 一直计算到商为0为止,然后将得到的余数由下到上排列,就得到了9的二进制:1001。 从上面的算法我们可以看到,用整数除以2,最终都能够到0。因此转载 2015-12-11 10:28:30 · 724 阅读 · 0 评论 -
内存对齐问题
结构体和共用体的内存分配是C语言的一个难点,也是面试题中的热点。编译器是按照什么样的原则进行对齐的? 先让我们看四个重要的基本概念:1.数据类型自身的对齐值: 对于char型数据,其自身对齐值为1,对于short型为2,对于int,float类型,其自身对齐值为4,double类型在VC下是8,GCC下是4,单位字节。2.结构体或者类的自身对齐值:其成员转载 2015-11-25 10:11:53 · 379 阅读 · 0 评论 -
Red-Black Tree 与 STL源码 (0)
由于STL中的关联式容器默认的底层实现都是红黑树,因此红黑树对于后续学习STL源码还是很重要的,有必要掌握红黑树的实现原理和源码实现。一、红黑树 简介:红黑树和AVL Tree(自平衡二叉查找树)类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL树中的非常严原创 2015-12-21 15:09:14 · 500 阅读 · 0 评论 -
Comparing Two High-Performance I/O Design Patterns
SummaryThis article investigates and compares different design patterns of high performance TCP-based servers. In addition to existing approaches, it proposes a scalable single-codebase, multi-platf转载 2015-12-15 15:02:49 · 453 阅读 · 0 评论 -
Reactor And Proactor
1、标准定义两种I/O多路复用模式:Reactor和Proactor一般地,I/O多路复用机制都依赖于一个事件多路分离器(Event Demultiplexer)。分离器对象可将来自事件源的I/O事件分离出来,并分发到对应的read/write事件处理器(Event Handler)。开发人员预先注册需要处理的事件及其事件处理器(或回调函数);事件分离器负责将请求事件传递给事件处理器。两个转载 2015-12-15 00:02:04 · 369 阅读 · 0 评论 -
写一个RSA签名与验签的Demo
一、RSA私钥及公钥生成OpenSSL工具安装RSA私钥及公钥生成OpenSSL工具安装Linux用户(以Ubuntu为例)sudo apt-get install opensslRSA私钥及公钥生成Linux用户(以Ubuntu为例)$ openssl 进入OpenSSL程序OpenSSL> genrsa -out rsa_private_原创 2015-12-28 15:07:07 · 6491 阅读 · 2 评论 -
复习下cmake
什么是 CMakeAll problems in computer science can be solved by another level of indirection.David Wheeler你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 M转载 2015-12-12 23:51:15 · 565 阅读 · 0 评论 -
指针辨析:悬垂指针、哑指针、野指针、智能指针
1:提出的原因:请看下面的代码片段:[cpp] view plaincopyprint?int *p=NULL; void main() { int i=10;p=&i; cout"第一次:*p = " cout"第二次:*p = " }转载 2015-11-25 10:34:59 · 679 阅读 · 0 评论 -
原码, 反码, 补码 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式翻译 2015-11-24 23:33:33 · 296 阅读 · 0 评论 -
虚析构函数作用
2008-08-29 15:56:40| 分类:技术文章(转载) |举报|字号 订阅(1)构造函数不能用虚拟,因为用也没用,不管是在栈上构造对象,还是在堆上构造对象,也不管你以后是否使用父类的指针或引用来指向或引用这个对象,在构造的那“一瞬间”,总归要指明要构造对象的具体类型,所以,对象在构造过程中不存在运行时动态绑定的多态行为。你理解这个意思原创 2015-04-13 22:55:34 · 418 阅读 · 0 评论