blog | 逍遥郡


  • Home

  • Archives

  • Tags

  • Search

C++中容易混淆的概念

Posted on 2009-02-25 |
初始化和函数声明 new int[size](); 这种写法表示整个数组初始化为0。因为空括号 (),意味着value initialization,而int属于primitive type,对于primitive type来说,value inialization等同于zaro initialization。(ref: c++11标准5.8.5) 注意:使用空括号()初始化时,前面应该是类型,否则不是初始化,而是声明了一个函数。比如: C x1; // ok,初始化了一个对象实例。 C x1(); // oops,声明了一个函数原型。 x1 = C(); // ok,初始化了一个匿名实例,然后赋值给x1。 拷贝构造和赋值构造函数 赋值构造函数是个错误的术语!应该称作拷贝赋值函数,因为后者其实并不用于构造。 class A { A(); A(const A&); A& operator=(const A&); }; A a; A b(a); // copy ctor A b = a; // copy ctor!! b ...
Read more »

C++ Multi-dispatch方法

Posted on 2009-02-17 |
Dispatch是运行时多态,是latter-binding技术。 Multi-Dispatch就是在一个函数调用里同时有多个变量类型需要在运行时确定。 C++、Java等这些OOP风格语言仅支持Single-Dispatch(虚函数),考虑虚函数运行时的动态绑定(RTTI),实际上是由调用函数的对象所决定的(即调用->或.之前的那个对象)。如果要支持Double-Dispatch或Multi-Dispatch,则需要由调用的对象类型+参数类型一起决定,甚至全部由参数类型决定(全局函数)。 关于C++的Multi-Dispatch参考BS的这篇论文《Open Multi-Methods for C++》。 看一个实际的例子。 假设:不同级别的销售卖不同级别的车会有不同的策略或价格,这里有SalesA, SalesB, CarA, CarB。 对于支持multi-dispatch的Common Lisp来说,解决这个问题就很trivial,四个函数搞定。 (defmethod strategy ((x SalesA) (y CarA)) ... ) (defmetho ...
Read more »

【译】把STL容器放入共享内存

Posted on 2009-02-04 |
昨天在上篇blog里描写了如何把STL容器放到共享内存里去,不过由于好久不写blog,发觉词汇组织能力差了很多,不少想写的东西写的很零散,今天刚好翻看自己的书签,看到一篇挺老的文章,不过从共享内存到STL容器讲述得蛮全面,还提供了学习的实例,所以顺便翻译过来,并附上原文地址。 共享内存(shm)是当前主流UNIX系统中的一种IPC方法,它允许多个进程把同一块物理内存段(segment)映射(map)到它们的地址空间中去。既然内存段对于各自附着(attach)的进程是共享的,这些进程可以很方便的通过这块共享内存上的共有数据进行通信。因此,顾名思义,共享内存就是进程之间共享的一组内存段。当一个进程附着到一块共享内存上后,它得到一个指向这块共享内存的指针;该进程可以像使用其他内存一样使用这块共享内存。当然,由于这块内存同样会被其他进程访问或写入,所以必须要注意进程同步问题。 参考如下代码,这是UNIX系统上使用共享内存的一般方法(注:本文调用的是POSIX函数): //Get shared memory id //shared memory key const key_t ipckey ...
Read more »

STL容器放入共享内存

Posted on 2009-02-02 |
STL 可以说是C++的重要的组成部分,它提供了一系列方便使用的容器,可以供我们存放数据,节省了很多开发时间。不过如果打算在多个进程之间共享一个STL容器,却常常会遭遇一些困难。比如你正在使用一个map,一般的IPC方法,可能下意识的你就会选择使用共享内存,如果可以把这个map放入一块共享内存供多个进程操作,那该多方便呢。然而问题却没这么简单,由于STL帮我们完美的封装好了map的内部方法,包括内存分配方案,这也导致了我们没法把map直接简单的用placement new放置到已知的共享内存上。 要完成这个任务就需要我们自己实现一个基于共享内存的allocator,替换map默认的allocator,在这个allocator中实现map的内存分配方案。关于allocator的讲解可以看侯捷的《STL源码剖析》这本书,写一个简单的allocator直接套下边的模板就可以了,主要实现的是这几个函数: max_size() 容器的最大容量 allocate(num) 为num个元素分配内存 construct(p) 将p所指的元素初始化 destroy(p) 销毁p所指 ...
Read more »

赞一下ubuntu的Windows免CD安装法

Posted on 2008-12-14 |
一直习惯了远程ssh工作, 所以好久没有遭遇到装系统这样的麻烦事了. 不过最近期望在本地部署一个系统, 所以打算安装一个ubuntu试试. 下载完ISO, 才懊恼的发觉手头没有空光盘可以刻录. 我想可能大家都遭遇过这样的事情, 再想起以前的那些硬盘安装方法也很头疼, 比如用vmware之类的. 不过可能我对Linux安装的印象太古老了, 上网查了一下, 才发觉ubuntu已然替用户考虑了这些繁琐的问题, 开发了一个wubi.exe的安装程序, 可以让用户异常方便的在Windows下免CD安装上ubuntu. 简单的几个步骤: 挂载上ubuntu的安装ISO. 如果你没有虚拟光驱程序, 直接解压ISO, 把其中的 .disk, casper, umenu.exe和wubi.exe 这四个文件和目录复制到某个盘的根目录下也行. 如果你想最终安装一个真正的Ubuntu系统到某个盘比如E:盘, 那不要复制到E:\上, 因为待会你会把它格式化掉. 如果只是想装个跑在Windows上的demo版本,那就无所谓. 运行 umenu.exe 在出现的 ...
Read more »

Git常用操作和技巧

Posted on 2008-11-18 |
[TOC] Git不同于从前的cvs、svn这种集中式的版本管理系统,它是分布式的。你可以不依赖于任何网络和服务在本地使用git,同样也可以很方便的多人协作。Git创建分支的代价非常小,甚至你可以为你的任何改动创建一个新的分支,然后修改后合并回去。 对于个人项目我经常会保持这样一些分支: master 主线分支 develop 开发分支,不断迭代到milestone milestone_xxx 一些milestone留存分支 20081118_feature_xxx 新增feature或者某个bugfix会另开一个分支,开发完成后合并回develop分支 建议对分支保持一定的命名规范,这样同时有很多分支时便于分辨。 Git 协作示例 部署Git 如果只是本地使用git,可以略过这部分。Git有多种部署方式,ssh应该是最简单的部署办法,甚至只要有ssh服务,就能利用git远程协作了。当然相对安全的办法是为git使用一个专用帐号: $ sudo adduser git $ su git $ mkdir ~/.ssh 安全起见,请限制git账户的权限, ...
Read more »

日志操作利器log4cxx

Posted on 2008-11-15 |
今天看了一场今年WCG的比赛,jaedong对阵stork,非常精彩。突然感觉星际里的微操和大局观就类同C和C++的开发,写C代码的时候就满脑子的字节、移位、共享内存、文件描述符之类的,C++就考虑类、模板、重载、IO流、标准库了。这只是个引子,在C开发一直用openlog(), syslog() 来记录日志,虽然方便,但不够强大。今天来看一下C++中的一些日志操作库。 流行的一些C++日志库有好些,比如 log4cplus, log4cpp, log4cxx, boost log 功能依次增强吧。 当前的状况是,log4cplus已然停止开发许久;log4cpp去年突然有了更新,升级到1.0稳定版;log4cxx今年有了更新,现在属于apache的一个项目;boost log功能最强,而且文档十分详尽,不过不清楚为何当年申请进入boost库被reject。前三个有着共同的前缀log4,意思是它们都是从apache优秀的log4j日志操作库port出来的。优秀的实现总是在多个语言和平台上都会被人借鉴。 文档状况是,除了boost log外文档都很匮乏,主要参照内容就是doxyge ...
Read more »

tcpdump分析soap包

Posted on 2008-11-13 |
Tcpdump是个异常强大的网络包抓取和分析工具,最近又把它翻出来了。因为在写一个Web Service相关的程序,嫌原来的脚本性能太差,准备用[Web Service]gSoap重写一遍。这台服务器是需要身份验证的,可是服务器应答我身份验证成功后,RPC调用依然失败,怀疑是否soap包的结构有错误呢。因为不清楚具体原因,所以想抓包看看。 我们知道一般使用tcpdump可以这样,这会打印出你所要抓取的包的详细内容,其中-X选项会同时打印出hex和ASCII格式的内容,特别适合分析新协议;-s0表示完整抓取所有数据包,如果你想过滤一些包,可以把数字0改成你所关注的数据包的最大字节数: # tcpdump -X -s0 host 192.168.0.1 and tcp and port 80 如果你在本机做实验,比如侦听本机apache的数据包,那么可以用参数-i指定侦听的设备: # tcpdump -i lo port 80 如果要抓取的内容太多,不希望打印到标准输出,那么可以通过-w和-r选项,写入到文件,然后再从文件中读出分析: $ tcpdump -w tcpdum ...
Read more »

python学习笔记

Posted on 2008-11-09 |
[TOC] Python Philosophy There should be one – and preferably only one – obvious way to do it. >>> import this 数据类型 基本类型 整型 integer,长整型末尾以 L 结尾 浮点数 float,转换字符串float(string) 几个等价的空值: None "" () [] {} python里的整形和长整型会自动转换。值得欣喜的是,python的长整型和lisp类似,可以无限大(仅受内存大小限制),这比PHP强大很多。 >>> int(12901082323112) 12901082323112L char和integer互相转换 >>> ord('a') 97 >>> chr(97) 'a' 不同进制之间互相转换 >>> bin(-37) '-0b100101' >>> hex(-37) '-0x25' 列表 ...
Read more »

使用jquery框架

Posted on 2008-10-30 |
在一年多前写过一篇使用ajax技术创建web站点的文章, 那是裸用的XMLHttpRequest对象, 当时在文中说要介绍一些现有的javascript框架, 不过一不小心就拖了一年了. 刚好暑假期间更新了一个web站点, 其中使用了当前流行的一个轻量级框架jQuery. 话说现在各种框架层出不穷, javascript的jQuery, Prototype, Dojo, 按笨重程度排序. python的Django. php的Codeigniter. 再到Cocoa, Carbon 之类的. 有了framework的好处, 可以让你从原来专注于编程细节的开发中解脱出来, 并且可以让你的程序结构紧凑规范. jQuery 整个库非常的精悍, 只有一个javascript函数, 其中jquery-pack-xxx.js是精简之后的版本, 体积很小, 建议使用. 现有七类函数, 并且支持plugins, 比如著名的lightbox. Core 基础类, 比如jQuery对象操作函数 DOM DOM操作函数, 比如增删DOM元素, 修改DOM属性等 CSS CSS操作函数, ...
Read more »
1 … 11 12 13 … 19
Julian Qian

Julian Qian

记录编程、Hack和自娱自乐的一些玩意。

189 posts
60 tags
RSS
Creative Commons
© 2024 Julian Qian
Powered by Jekyll
Theme - NexT.Mist