bug总结

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()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小喾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值