使用STL时遇到的新bug
正文
cpp的STL并不是万能的,最近在使用STL时,发现list容器的size()方法和empty()方法的时间复杂度居然不一样,通过查阅资料发现,list中size()方法居然是对整个容器从头遍历一遍,empty()方法则是判断首尾两个指针是否相等。这样一来,在性能要求非常高的情况下,若要对list判空,则只能用empty()方法。
在网络通信过程中,性能并不完全取决于程序写的好坏,也与通信机器本身、是否绑定CPU核心、以及带宽有很大关系。在我对项目进行集成测试的时候,发现将系统部署在我的开发虚拟机上时,两个进程的通信速度就有瓶颈,而将机器部署在实际的测试机器上时,在一般速度下,这个瓶颈就自然消失了。
在记录一个坑,这个坑之前其实踩过一次了,但是我没有长记性,又踩了一次,这就是对指针取地址的这个操作了。
对于一个数组,若要对其进行操作,如memcpy,一般这样来做
char buffer[4096];
char name[30];
memcpy(name, buffer, sizeof(name));
memcpy(name, &buffer[0], sizeof(name));
要将buffer中的前三十个元素的值赋给name,有上述两种写法,标准写法是后两种,但我们都知道,对于一个数组而言,数组名本身就代表着指向这个数组的首地址,因此就有了上述第一种的简单的写法。
对于指针亦是如此
char *buffer;
char *name;
memcpy(name, buffer, sizeof(name));
memcpy(name, &buffer[0], sizeof(name));
memcpy(name, &buffer, sizeof(name));
这次提供了三种写法,乍一看,好像没什么区别,实现的功能也都一样,但实际上这三种写法都是错误的,首先,共性的错误,在这次,name只是一个指针,指针的长度只与它的类型有关,因此对一个指针使用sizeof(),结果往往与预想中的大相径庭。其次,buffer本身是一个指针,对指针本身取地址,只能得到指针的地址,而非指针指向的内存空间的地址。
我对于指针的理解与思考
指针本身是一个变量,若变量的值是一个内存地址的话,则计算机会自动对这个内存地址再寻一次地址,从而直接显示这个地址所存储的内容,这就是我们常说的指针指向内存地址。也是指针的特性。但改变指针这个变量本身的值时,相当于是用另一个值覆盖了原先存储的地址,并不会对原先存储地址上的内容造成影响,也可以理解为指针直接指向另一个地址。