Squid源代码学习笔记3.16

今天我研究Squid源代码的艰苦里程算是正式开始了。
对于我这样一个C#开发者,对C++的语法理解首先就是个问题,不过好在我有过C的经验,对C++的语法也大体了解。

我的学习方式是,将Squid的源代码,基本原封不动的抄写到我自己的工程中去,且边写边进行单元测试。

前几天我打算直接调试EventLoop类,结果发现代码里圆圈套圆圈,为了加载一个看似很基础的类,我需要Copy N份文件到工程中去。没办法,只好耐心点,从底层慢慢来。

今天我抄写了
compat/compat_shared.h  前半部份文件,主要是为了引入max min函数, 后半部分现在跟我没关系而且又涉及到引用其他文件,compat文件夹里都是一些最基础的东西

acl/AclNameList.h 其实是个简单链表
include/memMeter.h 一个记录内存池高水线的文件
include/Range.h 模板类, Rage< TNode, TSize >
include/rfc...
src/Defines.h

其目标是调试MemPool.h中的内容

这里面有些C++的内容,一个是C++运算符重载,在C#里所有运算符都是成员函数,在C++里面则不然 = +=等是成员函数, + - << 则是全局函数,如果需要引用私有变量,需要在类内部定义指定friend。

C++语言的设计与演化中指出这么做是为了避免修改多处定义
例如
double d, complex z1, z2
complex z4 = z1 + d // z1.operator +(complex(d));
complex z5 = d + z2 // d.operator +(z2);
则需要定义d, complex内部的成员才可以
我觉着其实无需这么麻烦,编译器只需要判定最终转换结果是complex,然后
complex z4 = z1 + d // z1.operator +(complex(d));
complex z5 = d + z2 // complext(d).operator +(z2);
这样难道不可以么?

另外除了构造函数的隐式转换为,还提出了转换函数的概念
class complex { complex(double d)
class complext { operator const double()
C#里也有转换函数的概念

书中还讲了个小技巧
string s, t; 
...
s[i] = t[j]
如果要对读,写实现不同的操作,可以重载[]运算符,返回一个char_ref友元类,
然后分别定义该友元类的operator=操作和operator const char()操作
我觉着,虽然精妙,但是挺没必要。
如果真有如此需求,自己定义一个方法即可,把一切都封装在运算符重载中反而大大增加了复杂度。

另外在读代码中还发现了不懂的地方:

http://www.squid-cache.org/Doc/code/Debug_8h_source.html#l00076 第99行
http://www.squid-cache.org/Doc/code/src_2debug_8cc_source.html#l00736 第782行
这里面第二个的到底是在干嘛,真是理解不能?



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26899445/viewspace-756314/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26899445/viewspace-756314/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值