标签归档:cpp

RSS feed of cpp

最后更新于 .

最近的项目中由于要在C++代码中调用PHP的URL,所以不得不借助libcurl这个库,由于第一次用,所以很多地方很是纠结,特此写在这里,方便给同样刚入门的朋友指引。
分两篇介绍,第一篇是理论知识,第二篇是实例。快速链接--libcurl的使用总结(一)

一.下载安装
    1.到http://curl.haxx.se/download.html上下载最新版本,由于公司的机器安装rpm有依赖关系,所以直接下载了source
    2.编译。解压后进入curl的目录,直接执行 make all 就行。
    3.等待编译结束后,可以查看目录结构。
        curl/include/curl : 头文件目录 (一般只要包含curl.h即可)
        curl/lib/.lib/      : lib文件目录(有libcurl.a和libcurl.so,注意 ...

最后更新于 .

最近正在忙着做一个新的vim插件,功能可以说是完全为技术用家准备的,当然非技术用户也可以非常好的使用,代码已经写完了,中文介绍文档也已经ok了,剩下的就是老婆大人那边帮忙翻译出英文版的啦~ OK,废话不多好,为了过几天就会端出来的正餐,今天先给大家一些小甜点吧 今天主要是想实现在cpp文件中,自动添加.h文件的引用. 即在一个class1.cpp中,能够自动的添加一行代码

#include "class1.h"

其实这个功能可以说是很简单了,但是习惯偷懒的我,确实忍受不了每次都要去写一遍代码: vim脚本如下(特别说一下,有朋友反映我的vim脚本代码总是不高亮,结果换成高亮的html代码之后,总是保存出现问题,郁闷了,看样子还是继续调整一下):

function InsertIncludeFileI()     
    let sourcefilename=expand("%:t")     
    let outfilename=substitute(sourcefilename,'\(\.[^.]*\)$','.h','g')     
    call setline('.','#include "'.outfilename.'"') 
endfunction 
imap <c-b><c-h> <ESC>:call InsertIncludeFileI()<CR> 
function InsertIncludeFileN()     
    let ...

最后更新于 .

呵呵,废话不多说,先看看到底是啥好玩的语言特性~~
1.

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
int main(int argc,char* argv[])
{
    char a[20]=“world”;
    printf(“%c\n”,a[2]);
    printf(“%c\n”,2[a]);
    return 0;
}

对于这段代码,你觉得是否会编译通过,并且正确运行呢?

2.

#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
class Foo {
  public ...

最后更新于 .

今天组内调来了一个架构组的大牛,结果一来就给我的代码找出了一个问题。唉,还是学艺不精啊。
问题如下:通常我们在使用C++的new的时候,都是这样用的:


char *temp = NULL;
temp = new char[1000];
if(temp == NULL)
{
return false;
}

初看起来似乎没有问题,我们来做个测试,测试代码如下:


int main(int argc,char* argv[])
{
char *test=NULL;
while(1)
{
test = NULL;
test = new char[1000000];
if(test == NULL)
{
printf("I am wrong\n");
break;
}
}
printf("I am ok!\n");
return ...

最后更新于 .

在使用C++时,我们经常会使用到STL,相信很多人都想过,如果vim能实现stl库自动补全就好啦,这篇文章,我们就来实现这一点。 (文中所有操作均在windows下进行,在linux也一样可以实现,笔者就不写了)

1.请确保安装好了ctags,和omnicppcomplete;如果你还没有安装好,请参考这两篇文章:把VIM打造成一个真正的IDE(2)把VIM打造成一个真正的IDE(3)

2.下载STL库的头文件和实现。下载路径如下: http://www.vim.org/scripts/script.php?script_id=2358

OK,现在工具已经准备齐了,接下来就是生成tags啦。 去刚下载的STL目录,用ctags命令生成tags文件,命令如下:

ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .

(如果你看了我之前的文章,那么直接用F12生成就行)

有了tags之后,你可以把这个tags换个名字,比如叫stl_tags,然后放到C盘,通过命令

set tags ...

最后更新于 .

这几天在做一个API的时候,由于后端服务器量太多,导致前段webserver的CGI连接数过多,所以,不得不使用连接池来进行管理。(好吧,我知道说出来有点恐怖,600台webserver,125台32G的cache服务器,也就是cache量接近3T……)
之前有人实现过,大体思路如下:
1)定义一个list数组,里面的每个指针对象维护一条连接,并且为list规定一个最大值。
2)每当有信莲连接生成时(或者已经有的连接重新使用),就向list中添加一个对象;如果list的大小已经大于最大值,那么就把最后一个对象关闭并且扔出连接池(也就是要求,在这个对象的连接被断掉后,这个对象再次使用时,应该有重连的功能)

这样做的确比较简单,但是也会产生如下几个问题:
1)在第二点中,如果是已经有的连接重新使用,假设我们规定list的最大大小为1,那么这个被重复使用的连接实际上是在被重复的关闭和重新打开。
2)没有权重的概念,即可能对于一个访问频率比较高的连接,很可能会被一个访问量比较低的连接冲击导致连接断掉。

基于以上考虑,我重新设计了一套连接池模型:

typedef _conn_info
{
    int iCreateTime;//就是创建这个结构体的时间(第一次建立连接时的时间)
    int iLastTime;//最后一次被调用的时间
    int iReq;//被使用到的次数
    CConnClass* ptrConn;//对象的指针,维护着一个长连接 ...

最后更新于 .

众所周知,大名鼎鼎的STL使用大量的模板,但是有时候我们也会面临一些需求,比如map或者vector里的数据类型被定义成模板,但这个时候,用起来就会出现问题。
我们先来看一个没有问题的例子:

/*===========================================================
#  Author:          DanteZhu - https://www.vimer.cn
#  Email:           dantezhu@vip.qq.com
#  FileName:        tem.cpp
#  Version:         1.0
#  LastChange:      2010-01-12 10:20:07
#  Description:     
#  History:         
===========================================================*/
#include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
typedef struct _CTT
{
    int len ;
}CTT;
template <typename T>
class CParse
{
    public:
        static ...

最后更新于 .

这几天在写一个项目,其中有用到打包和解包的网络通信,相信有过网络编程经验的朋友应该都知道,无非就是 将一个结构体打包成一段buff,以及反向的过程。(这里我们不考虑直接memcpy的情况,因为结构体里的字段有可能只是指针,当然如果都是定长数据的话,那么memcpy当然是最快的) 而在这个过程中,很多代码只是改了很少一部分,但是却要分别写两个函数,严重浪费了人力,而且容易出错。现在让我们看一下,能否用vim来替我们自动完成这件枯燥的事情。 我们来看这样一段示例代码:

int Output( unsigned int ver, char* & buf, int & iLen, int iMaxLen )
{
    int needLen = sizeof(char) * 3 + sizeof(short) + sizeof(int);
    if( needLen > iMaxLen )
    {         
        return FBErrSystemNoMem;
    }     
    char *t_Buff = buff;
    *(unsigned char *) t_Buff = placeId;
    t_Buff += sizeof ...

最后更新于 .

之前已经在博客里写过一篇关于限速的文章,这几天给别人用时发现,用C方式的结构式代码的确不方便别人使用,所以就用C++封装了一下,用起来也简单了很多。
主要实现了:
1.对速度的限制
2.动态调整速度的侦测周期,减少由于限速而带来的对CPU的消耗。
希望大家批评建议。

使用方法很简单,如下:

#include <iostream>
#include "timelimit.h"
using namespace std;
int main()
{
    CTimeLimit timelimit;
    //设置每秒最多10个
    timelimit.Init(10);
    while(1)
    {
        timelimit.DetectAndLimit();
        printf("%d\n",timelimit.Speed());
    }
}

源代码下载

 

最后更新于 .

在服务器上,我们经常会有多个CPU的情况,而此时如果把进程都绑定在一个CPU上,那么对资源太多浪费了,下面的代码就实现了如何将程序绑定在不同的cpu上。传入参数代表绑定第几个cpu(从0开始计算)

//cpu_test.cpp
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/sysinfo.h>
#include<unistd.h>
//#define __USE_GNU
#include<sched.h>
#include<ctype.h>
#include<string.h>
int main(int argc, char* argv[])
{
        int num = sysconf(_SC_NPROCESSORS_CONF);
        int created_thread = 0;
        int myid;
        int i;
        int j = 0;
        cpu_set_t mask;
        cpu_set_t get;
        if (argc ...