1 .问题:SIGPIPE 引起崩溃
解决:使用信号处理函数忽略SIGPIPE
原因:send/write 在操作时如果关闭了描述符就会产生SIGPIPE,导制崩溃
2. 问题:no matching function for call to
临时变量不等作为引用参数的入参 int fun(int&a) fun(6+2) 不行。
3. linux 文件的X的权限是执行, 目录的X权限是进入
4.函数重载 :
1.参数分为引用和非引用的不能声明为重载函数,但是const可以。
2.如果多个重载参数类型为int,long这种数字类型的,也不能区别,因为数字类型可以强制转化。
3.参数的特征必须不同,如果参数特征表相同返回类型不同也能成为重载函数。
4.识别重载函数,是根据函数的参数类型对函数名进行加密
5 && 双引用
#include <stdio.h>
#include <string>
void print(const std::string& name) {
printf(“const value detected:%s\n”, name.c_str());
}
void print(std::string& name) {
printf(“lvalue detected%s\n”, name.c_str());
}
void print(std::string&& name) {
printf(“rvalue detected:%s\n”, name.c_str());
}
int main() {
std::string name = “lvalue”;
const std::string cname = “cvalue”;
print(name);
print(cname);
print(“rvalue”);
}
lvalue detected:lvalue
const value detected:cvalue
rvalue detected:rvalue
说明如果有专门为右值重载的函数的时候,右值的传参会去选择专有函数(接受&&
参数的那个),而不去选更通用的接受常量引用作为参数的函数。所以,&&
可以更加细化右值和常量引用。
GDB调试网络程序时,会遇到SIGPIPE信息,默认GDB会把程序停下来,即使程序使用signal(SIGPIPE, SIG_IGN);来忽略信号。
用handle命令设置一下缺省的signal的处理行为即可:(在gdb模式下运行下面的命令) handle SIGPIPE nostop print
如果连信息提示都不想看见,可以这样设置:
handle SIGPIPE nostop noprint
来源: http://www.cppblog.com/elva/archive/2011/11/01/159457.html
信号(Signals)
信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。UNIX定义了许 多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号; SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。
GDB有能力在你调试程序的时候处理任何一种信号,你可以告诉GDB需要处理哪一种信号。你可以要求GDB收到你所指定的信号时,马上停住正在运行的程序,以供你进行调试。你可以用GDB的handle命令来完成这一功能。
handle
在GDB中定义一个信号处理。信号可以以SIG开头或不以 SIG开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从SIGIO信号到SIGKILL的信号,其中包括SIGIO, SIGIOT,SIGKILL三个信号),也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号,运行程序马上会被GDB停住,以 供调试。其可以是以下几种关键字的一个或多个。
nostop
当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号。
stop
当被调试的程序收到信号时,GDB会停住你的程序。
print
当被调试的程序收到信号时,GDB会显示出一条信息。
noprint
当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。
pass
noignore
当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。
nopass
ignore
当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。
8 vector.assign 比 vector.insert效率高
struct timeval bg, ed, bg1, ed1;
vector<int> vecTmp;
vector<int> vecTmp4;
vector<int> vecTmp2;
vector<int> vecTmp3;
for(int i = 0; i < 50000000; ++i)
{
vecTmp2.push_back(i);
}
for(int i = 0; i < 50000000; ++i)
{
vecTmp3.push_back(i);
}
gettimeofday(&bg, NULL);
vecTmp4.assign(vecTmp2.begin(), vecTmp2.end());
gettimeofday(&ed, NULL);
cout << "assign time us:" <<( ed.tv_sec - bg.tv_sec )*1000000 + (ed.tv_usec - bg.tv_usec) << endl;
gettimeofday(&bg1, NULL);
vecTmp.insert(vecTmp.end(), vecTmp2.begin(), vecTmp2.end());
gettimeofday(&ed1, NULL);
cout << "insert time us:" <<( ed1.tv_sec - bg1.tv_sec )*1000000 + (ed1.tv_usec - bg1.tv_usec)
运行结果:
assign time us:22070542
insert time us:54802747
数据量小的时候也是assign比较快
为什么会这样???
赋值非常有效率,因为它知道要拷贝的 vector 有多大,然后只需要通过内存管理一次性拷贝 vector 内部的缓存。
所以,想高效填充 vector,首先应尝试使用 assignment,然后再考虑基于迭代器的 insert(),最后考虑 push_back。当然,如果你需要从其它类型的容器拷贝元素到 vector 中,赋值的方式不可行。这种情况下,只好考虑基于迭代器的 insert()。