也有好久没来写博客了,去了深圳一趟,把档案问题解决好了,接下来就可以安心研究技术的阶段。
这几天主要都是在练手,写代码的能力还要继续加强,打好写代码的基础才是王道,做技术,很大的一个区别就在于你愿不愿意动手,若是眼高手低,懒而不动,等于浮沙筑高台,没有实践的经验,怎能做到在开发中构建宏伟蓝图并付诸实现呢?
技术方面,前段时间做了一个在Web上实时播放视频流并配置编码器的activex控件,觉得activex技术不错,但是搞得过于复杂。尤其是在用MFC做的时候,非常痛苦。.net是个好东西,但是那东西你不可能放到嵌入式平台上做。所以对于嵌入式设备,还是只有activex技术可用。界面是一大麻烦,处理界面是繁琐无趣的,尤其是没有一个完整设计的情况下。
好在ATL中有一个DHTML控件,所以我就想,难道不能用HTML+CSS+Javascript来做界面,然后通过javascript来进行与C++ handler的交互吗?试验了一番,此计可行。相信很多公司也都是这么做的,directUI技术与此类似,但是我觉得directUI貌似一直也没怎么火起来,亦或是directUI都被作为技术机密隐藏了起来,不是很了解。
今天看了一下,一个只有非静态,非虚成员函数的C++类的大小是多少?经过GCC与VC测试,大小都为1.为什么?首先是因为类的非静态非虚成员函数是不在类的内存结构中的,非静态非虚成员函数void class::func(int)实际上是func(class& obj,int),所以整个类就可以认为是一个空类。而空类的实例为了保证在内存中是独一无二的,编译器就会为空类加上一个隐含的字节。这就是为什么最后得到的值是1.
这样就好理解为什么不提倡虚函数了,虚函数的地址保存是由vptr指向的虚表中。而非静态非虚成员函数实质上是一个固定地址的函数。当调用虚函数的时候,还要经过查表这一步,就要首先通过vptr获得vtable,再去调用虚函数。在汇编中就要多了几步:
1.获取vptr
2.获取vtable
3.从vtable中获取到实际调用的函数的地址
4.jmp到指定的地址
在现在的处理器的架构下,一般都采用多级流水线,调用虚函数的操作会导致流水线锁定。效率到底会损失多少?有一篇比较详细且有详实比较数据的文章,可于这里查看:
http://blog.csdn.net/hengyunabc/article/details/7461919
指针与引用的区别:我觉得指针与引用的区别可以参考指针与数组的区别。引用也是代表的一块内存区域,它可以转为指针,但是它不是指针。