随笔分类 - C/C++
摘要:学习何时以及如何使用 POSIX AIO APILinux® 中最常用的输入/输出(I/O)模型是同步 I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需要使用任何中央处理单元(CPU)。但是在某些情况中,I/O 请求可能需要与其他进程产生交叠。可移植操作系统接口(POSIX)异步 I/O(AIO)应用程序接口(API)就提供了这种功能。在本文中,我们将对这个 API 概要进行介绍,并来了解一下如何使用它。AIO 简介Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它
阅读全文
摘要:(1) 指针的大小永远都是4字节,因为保存的是地址。(2)堆:它的物理内存空间是由程序申请的,并由程序负责释放。 栈:它是由操作系统分配的,内存的申请与回收都由OS管理(先进后出)。(3) char i[10]={'a','b','c','d','e','f','g','h','i'}; cout<<i<<endl; //输出 abcdefghi 如果i是数值型的话,这里输出的是相应数值变量的首地址 cout<<&a
阅读全文
摘要:字节对齐有其中一条规则是这样说的:结构体的总大小为结构体最宽(最大)基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。(所以在vs下,sizeof查看大小的时候默认对齐大小是取最宽的数据类型的大小)原因:CPU的访问粒度不仅仅是大小限制,地址上也有限制。也就是说,CPU只能访问对齐地址上的固定长度的数据。以四字节对齐为例,就是只能访问0x0-0x3,0x4-0x7,0x8-0xc这样的(闭)区间,不能跨区间访问。如果真正需要访问的数据并没有占据那个区间的全部字节范围,还有另外的信号线来指出具体操作哪几个字节,类似于掩码的作用。好像也有些架构干脆就不允许这种部分访问,强制
阅读全文
摘要:在传统服务器结构中, 常是有一个总的监听线程监听有没有新的用户连接服务器, 每当有一个新的用户进入,服务器就开启一个新的线程用户处理这个用户的数据包。这个线程只服务于这个用户 , 当用户与服务器端关闭连接以后,服务器端销毁这个线程。然而频繁地开辟与销毁线程极大地占用了系统的资源。而且在大量用户的情况下,系统为了开辟和销毁线程将浪费大量的时间和资源。线程池提供了一个解决外部大量用户与服务器有限资源的矛盾,线程池和传统的一个用户对应一个线程的处理方法不同, 它的基本思想就是在程序开始时就在内存中开辟一些线程, 线程的数目是固定的,他们独自形成一个类, 屏蔽了对外的操作, 而服务器只需要将数据包交给
阅读全文
摘要:先来一个实例:首先要说明的是,若用户没有定义,C++隐式声明一个复制构造函数和一个赋值运算符(完成按数据成员复制的动作)。二者很像,但是在下边这点上有很大的不 同:复制构造函数是只在对象实例化时才会被调用,也就是说,在复制构造函数调用期间,这个对象处于一个未决状态(直到复制构造函数被成功调用),另外复制 构造函数不返回任何值,void都没有。而赋值运算符则在一个现存的对象被赋予新的值时被调用,并且它有返回值。在下边这个例子中我们能看到并不是出现“=”就是调用赋值构造函数:#include using namespace std; class Test{ public: ...
阅读全文
摘要:背景Linux 平台上的多线程程序开发相对应其他平台(比如 Windows)的多线程 API 有一些细微和隐晦的差别。不注意这些 Linux 上的一些开发陷阱,常常会导致程序问题不穷,死锁不断。本文中我们从 5 个方面总结出 Linux 多线程编程上的问题,并分别引出相关改善的开发经验,用以避免这些的陷阱。我们希望这些经验可以帮助读者们能更好更快的熟悉 Linux 平台的多线程编程。我们假设读者都已经很熟悉 Linux 平台上基本的线程编程的 Pthread 库 API 。其他的第三方用以线程编程的库,如 boost,将不会在本文中提及。本文中主要涉及的题材包括线程开发中的线程管理,互斥变量,
阅读全文
摘要:IO模型在Richard Stevens的《UNIX网络编程,第一卷》(程序猿必备!)一书中有非常详尽的描述,以下简要介绍,并给出代码示例。另外比较好的总结性blog,推荐:使用异步 I/O 大大提高应用程序的性能IO - 同步,异步,阻塞,非阻塞 (亡羊补牢篇)常见网络IO模型:阻塞式IO、无阻塞式IO、IO复用、异步IO、信号驱动阻塞式IO:在一个进程发出IO请求后,进入阻塞状态,直到内核返回数据,才重新运行,如图:代码sever端: #include #include #include #include #include ...
阅读全文
摘要:普通的new type(value)会在堆上开辟一个地址空间,而new (addr)type(value) 看似类似new type(value),实际却不同。new (addr)type(value)只是把addr里的值更改为value,而不会新开辟一个空间。
阅读全文

浙公网安备 33010602011771号