条件控制,条件传送与__builtin_expect 如果我们现在要写一个函数,参数为两个整数,要求返回这两个整数差的绝对值,我们会有如下的写法。int diff(int a,int b){ if(a<b) return b-a; else return a-b;}现在给出另一种写法int diff(int a,int b){ int x1=a-b; int ...
简单的TCP带宽测试工具TTCP 源码可以从陈硕的github上下载到,位置在muduo-master\examples\ace\ttcpTTCP是一个传统的测试TCP性能的工具,它主要测试两个机器之间TCP的吞吐量,在应用层模拟消息传递的过程——客户端发送一个包,服务端对包进行确认,并且在确认之前客户端不发送下一个包。可以设置发包的数量和每个包的大小,程序计算传输所有包所用的时间,然后计算出带宽。操作流程图以上发...
剖析函数传递参数选择引用或值的区别 如果对ESP,EBP,栈帧等概念比较陌生,推荐先去了解一下函数调用的过程。推荐使用OD+VS自己实现一遍加深印象。(OD用来查看内存,VS用来看汇编代码和源代码的对应情况)mov与lea的区别指令:mov 操作对象:变量 有无[]没有区别,都是取值指令:mov 操作对象:寄存器 有[]表示取地址,没有[]表示取值指令:lea 操作对象:变量...
C中的强符号与弱符号 作用域c语言的作用域有两种,代码块作用域和文件作用域。代码块作用域是指由花括号限定的作用域,花括号以外的作用域就是文件作用域。这里指的花括号可以是函数的花括号,if,while,for,namespace的花括号,遵循的基本规则是花括号以里可以看到本花括号以外的东西,但是相反则不可以。int main(){ int y=4; { int x=3; ...
再探C++中的常量 什么是常量?相信绝大多数写过程序的人见到这两个字的第一反应就是——不能更改的量。没问题,书本上这样告诉我们,编译器也这样告诉我们,好像常量就真的是那么简单,纯粹,让人心安理得的去使用它,不需要任何顾虑。但事实并没有想象中的那么单纯。1.常量并不一定是常量int main(){ const int x=3;}这是一个“假常量”,当我们在下边敲出 x=4; 这样的代码时,编译...
从汇编语言角度辨析char*str="abc"和char str[]="abc" 所以说想要从根本上理解这种语言上的trick就要直接看他的汇编代码,对着经验和现象猜来猜去就如同盲人摸象。 char*str="abc";01092BFE mov dword ptr [str],109CC70h char strr[]="abc";01092C05 mov eax,dword ptr ds:[0109CC70h] ...
Linux内核计时器 linxu内核中完成的许多功能都需要感知时间的行进,比如定期把页面缓存中的数据写入磁盘,定期进行进程调度,提供获得当前时间的系统调用,还有计划任务的实现,让系统在某段时间之后执行某个程序,或者在某个时间点执行某个程序。以上这些功能对时间的把控都是由系统计时器完成的。 我们可以把系统计时器简单的看做一个按固定频率产生中断的硬件芯片,产生的中断就叫做定时器中断,而和时间相关的任务都在这个中断...
使用CAS操作实现的无锁栈 CAS(compare and set),是原子数支持的一种操作,假如我们有一个原子数类,那么他其中的CAS函数大致可以理解为这样bool compare_and_set(T&a,T&b){ if(*this==a) { *this=b; return true; } else { a=...
C++11线程池 线程池其实就是把任务队列和工作线程绑到一起,提供一个向任务队列中添加任务的接口,下面的代码为了表达更加清楚没有分成头文件和源文件,仅仅是提供思路。同步机制利用的互斥锁+条件变量,也可以使用C++11提供的原子数封装的自旋锁+条件变量。两种组合的区别在于,自旋锁比较适合当任务比较简单的时候使用,可以减少陷入内核的次数,但当任务比较复杂,线程需要较长时间等待的时候,自旋锁会把大量时间浪费在忙等待上...
从汇编语言角度剖析右值引用和左值引用的本质 右值引用着实让人很挠头,而他又很重要,看多了“右值是短暂的,左值是持久的”这种正确但是让人摸不到头脑的话,我觉得很有必要从右值引用和左值引用实现的层面进行一次区分。首先明确一点,左值引用和右值引用,都是指针。其实说白了他们都是编译器给我们提供的“功能”,也就是说,编译器在我们看不到的地方做了很多别的事情,让一个指针的用法变得如此丰富多彩。但是不管多么丰富多彩,他也只是一个指针而已。先来...
tinyhttpd源码剖析 这是一个简单的服务器程序,只有五百多行。每次来一个请求就开一个线程去处理它,可以解析POST,GET而且可以执行CGI程序。服务器程序想要把自己收到的参数传给某些别的程序去执行,并且把这些程序产生的输出拿走,发给某个目标对象。CGI所处的位置就在“服务器把收到的参数传给别的程序”这个环节。它规定了一个标准的借口,我们只需要调用setenv()把收到的东西设置成条件变量,然后再通过execl执行...
shared_from_this的使用 当你想使用一个类的某个成员函数返回指向这个类的指针的时候,可以这样写class A{public: A(int y=0):x(y){ } A* getthis() { return this; } int x;};int main (void) { A a; cout<<a.x<<endl; A*p=a.getthis(); p->...
auto_ptr和unique_ptr auto_ptr是老版本的智能指针,当时还没有unique_ptr,shared_ptr,weak_ptr,现在auto_ptr已经被废弃,他有了更好用的替代品unique_ptr,相对于他的后继者,它有以下几个缺点。1.auto_ptr可以进行赋值和拷贝运算,但是他虽然名义上做的是赋值和拷贝,但是背后做的却是move语义做的事情,拷贝和赋值之后,源对象被置位空,这看起来十分反常。而uniqu...
C++智能指针自定义删除器 智能指针支持用户自定义删除方法,默认为delete或者delete[],不过当我们用一个裸指针定义一个智能指针,而裸指针指向的内存是malloc出来的时候,显然用delete删除会出问题,比如。struct A{ int a,b; int*p; A() { p=(int*)malloc(sizeof(int)); } ~A() { free(p); }};int...
C++中的using关键字 罗列一下using的几种用法1.using namespace 这是最常见的用法,C++用命名空间把各种函数名字变量名字类名字保护起来。2.在子类里使用父类的private成员class A{public: int v;};class B: A{public: using A::v; void fun() { cout<<v<<end...
epoll详解 IO复用函数统共有三个,select,poll,epoll,但是在大并发条件下,我们一般都会使用epoll,select和poll有下边两个缺点。每次在调用之前都要把所有需要监控的socket都传给内核 无论是在内核还是在用户空间select和poll都是采用轮询的方式检查所有socket而epoll正是在这两点上做出了改进,得到了比select和poll更高的效率。epoll的原理...
linux中的动态链接库 在使用动态链接库的时候并不会把动态库的代码全部copy到生成的程序中,而是在程序运行的时候再去加载对应的代码,所以使用同一个动态库的程序可以共用一份代码,而且当你对动态库进行升级的时候,也不用去修改使用它的代码。以上是动态库生成使用的全过程,可是当运行的时候却出现了这种错误。用ldd命令再看一下怎么会找不到,编译的时候不是加进去了吗,而且编译的时候也没有报错。因为程序编译的...