天秤座的唐风

总会有一个人需要你的分享~!- 唐风 -

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  13 随笔 :: 0 文章 :: 69 评论 :: 0 Trackbacks
共2页: 1 2 
另,正在做提案去error-code化,加exception的体系设计。
但是做嵌入式,大家都很敏感,所以还是要先把现在所用的平台和编译环境中,exception空间和时间开销分析清楚给客户。目前还在整,感觉时间开销上完全没有问题(特别是normal case中,异常时其实慢一点也无所谓了,因为设计中的异常真的是非常非常地异常!),但代码膨胀还是有点点担心(因为存储空间比较有限)。不知道 MS 是不是有这方面的数据?特别是WinCE500方面……
异常处理这段深有同感。

现在做的系统中流用了大量的C代码,全部是error-check方式。

只能说,用error-check大部情况下只是“掩耳盗铃”而已,Check一下函数出错了就打个屏,完全没有想过是否可能恢复,如何恢复,也没有办法想,error-code根本就传不出去。

所以软件“品质”就成了“测出来的”,而不是设计出来的了,因为设计的时候根本就无法处理这么复杂的层次的函数调用带来的错误码,而且中间只要有人不传递就完蛋了。
信了楼主的体验,升级了工程(当然,偶是下的“试用”)
智能提示很慢,和VC助手的功能相比差距还是很明显啊

不过2012启动还是很快的。
虽然如此,还是受不了没有助手的生活。
果断退回
@chaogu
郁闷的是地大被定义为三流~而你还来一个“我是三流学校的怎么样”
我可没有因为自己是地大的而有觉得有什么好郁闷的。我还是很怀念地大的生活的,呵呵。
看了你的自我介绍,中国地质大学的校友郁闷地飘过~~~
@Tanky Woo
用Windows Live Writer写,再发布,有图的文章尤其方便撒~!
@空明流转
兴趣是有,图形知识几乎为0.
好吧,我申请去给你们打打杂~!
看你们收不?
造3D图形引擎吧!
re: 关于C++之“复杂” 唐风 2010-07-10 21:29
不记得是在哪里看到的了,大意是:
一个优秀程序员要掌握的知识无论使用哪些语言都是差不多的,不同的地方在于:使用C++的话,你必须把它们大部都学会了,你才能动手做一些有实际意义的东西,(否则你将面临着一大堆的陷阱)。而Java/C#等,则可以把学习的“时间”平摊,在你没有“完全”掌握这些知识之前,你已经可以做一些实际的东西出来了(虽然这个时候还称不上是“优秀”的程序员)。
我觉得,C++所谓的复杂性,大约就是这样。
PS:把Java/C#放在这里并不想引起争论。但是我想,如果世界只有一门语言的话,大概没有谁会“抱怨”它的复杂性。要说它复杂,那是比起其它语言的“感觉”。所以,不比较是不可能的……好纠结
re: 代理服务器的简单实现 唐风 2010-06-28 08:43
很少见到博客正文用楷体的,呵,不过博主的排版还是很漂亮的。
文章也让我受教了。谢谢!
哈哈,好,这个系列会很有价值的楼主!
确实题目不清楚。呵呵
re: 模仿学习的困局 唐风 2010-06-09 23:24
我只是模仿个 AGG ,亦有同感了。

re: boost库之Assign 赋值库 唐风 2010-06-06 15:15
唉,还是希望出现语言级别的“糖”,还是希望有 initializer-list ……
re: 算法导论评 唐风 2010-05-29 22:34
这篇书评写得非常棒!!
不过我觉得《算法导论》中的伪码还是挺漂亮的,呵呵。

可惜我只看完图算法就停下来了,习题基本没做,买椟还珠了,主要是没有你这样的毅力。PF你~!

gay……呵呵,搞错词了不老大~!

多用用标准库就更好了。


re: 对 C++ 历史的个人观点 唐风 2010-04-07 20:50
@OwnWaterloo
很精彩,呵呵。
关于allocator这段,我看得很仔细,因为,在TopLanguage里,有一个主题是《{技术}{C++} 突然有一种想法:将文本文件读入vector可以跨过push_­back()吗》
http://groups.google.com/group/pongba/browse_thread/thread/ebb85b7e927c1af9/aebc1741ed60b2f5?hl=zh-CN&lnk=gst&q=%E7%AA%81%E7%84%B6%E6%9C%89%E4%B8%80%E7%A7%8D%E6%83%B3%E6%B3%95%EF%BC%9A%E5%B0%86%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E8%AF%BB%E5%85%A5vector%E5%8F%AF%E4%BB%A5%E8%B7%A8%E8%BF%87push_back()%E5%90%97#
我在里面表达了与OwnWaterloo同样的观点,但我的认证和说明肤浅多了。我刚刚还特别翻了下,发现当时的“辩方对友”居然正是楼主,世界太小了(楼主也是牛人,哪都见得到滴说)。

在这个问题上,我与OwnWaterloo相同,并从他的回答中又学到不少东西。我喜欢这样的“技术论战”,因为它总是能让人进步,呵呵。向楼主,和OwnWaterloo学习。

re: [翻译]高效使用auto_ptr 唐风 2010-04-07 20:32
@giscn
给些例子或是一些链接不咧
我赞同本文的观点,但同时很想知道“远离 auto_ptr” 的理由是否也能说明我。

谢谢了。

re: 成熟 余秋雨 唐风 2010-04-04 13:48
@abilitytao
余的《文化苦旅》和《山居笔记》都灰常好看,高中的时候曾经很迷,哈哈。
现在觉得他更像娱乐圈的人了……
re: 成熟 余秋雨 唐风 2010-04-03 22:43
我记得我背过这段,呵呵。
re: 苏东坡突围 —余秋雨 唐风 2010-04-03 22:42
《山居笔记》里的吧
俺也挺喜欢看,高中时候的事儿了……唉,一恍7、8年。

@Uniker
看样子您像是只看了标题没看内容……

re: MFC中一个危险的Bug 唐风 2010-03-28 11:17
1. 遗留代码不可替代
2. 升级开发环境的预算和必要性
3. 有决策权开发人员的“技术惯性”
使得VC6到现在还这么有“生命”力。感觉就像IE6一样,哈哈,有种种的不好,可偏还是有那么多用户。

反正我是等VS2010出来就准备XX的,嘿嘿。

哈哈,这个猛!!

re: 虚惊一场的海啸 唐风 2010-03-08 05:20
哈哈,期待下篇 Bug 解析!!
@陈梓瀚(vczh)
陈版 .net ?
哈哈~~~~
re: C++杂感 唐风 2009-12-25 07:36
“像贵国的等级考试这类的考察语言偏僻细节上”?
请问阁下哪国人?

路过……
:)
唉,明修栈道,暗渡陈仓。
@Vitacy.Tan
话又说回来,在你的做法中,并没有直接在 function pointer 和 void* 之间进行转型,而是为 function pointer 创建(new)了一个对象,赋给 void*,这样做我感觉是没有问题的,这时候 void* 指向的仍然是一个“对象”,呵呵。
但这么做可能在“效率”上不如直接备份 function pointer 。毕竟,创建时候的 new 和调用时的转型加最后的 delete,都比直接存 function pointer 负担大。但这样做获得了代码上的一致性,我倒是挺喜欢的,呵呵(如果确实没有“我所不知道的问题的话”)。
@Vitacy.Tan
在网上找了一下相关的资料,发现这个问题其实已经有了比较多的“讨论”,还有专门论述的文章:
http://www.safercode.com/blog/2008/11/25/generic-function-pointers-in-c-and-void.html

简而言之,就是:
不能 void* 和 void(*f)() 合并成一个,原因是对于 C 标准而言,这两个“东西”并不保证一致,函数指针的大小可能比 void* (也就是指向数据的指针大小要大),可能会包含更多的信息,如果在这之间进行转换的话,在某些平台会产生未定义的行为(在 Windows 平台下,这样做是没问题的,参考http://stackoverflow.com/questions/1867698/casting-a-void-pointer-data-to-a-function-pointer 中的回复)。因此,这么做是为了可移植性的考虑。

相关原文如下:
Why can’t we use void* for a Generic Function Pointer?
This is because a void* is a pointer to a generic “data” type. A void * is used to denote pointers to objects and in some systems, pointers to functions can be larger than pointers to objects. So, if you convert amongst them, you’ll lose information and hence, the situation would be undefined and implementation dependent. Most compilers won’t even warn you if you convert between them but some might error out, if you try to call such a void * to function pointer converted. But even they might fail to alert you, if you take care of typecasting the call perfectly (Enclose in parentheses before function call brackets). And then, one fine day, you’ll try to compile and run your program on one of the aforementioned systems, and then keep on wondering why your program segfaults.

Note: C++ does allow this “conditionally” which means that such a conversion is allowed but a compiler is not bound to implement this feature, which again makes its usage circumspect.

另外,我还是不太明白,function pointer 可能携带的其它信息是什么,呵呵,再查查喽。

谢谢 Vitacy.Tan 的回复,让我能更深入的了解这方面的知识。
嗯,有人能参与讨论就是好啊,希望大家多指点。



re: ACM主要算法 唐风 2009-12-12 23:45
谢谢你的总结!!
真是太好了,正在找这样的资料,呵呵

C++0x 中貌似可以。
确实是一种很合理也很有用的初始化方式。
@Vitacy.Tan
嗯,试过了你的代码,确实在我的例子的情况下,你的做法没有问题而且更简洁。呵,说真的,第一次看到 new 一个 function pointer 对象,有点诧异。后来想通了,function pointer 也不过就是一个 pointer 而已。
但 boost::function 中确实对两者进行了区分对待,而且考虑了更多的情况情况:
/**
       * A buffer used to store small function objects in
       * boost::function. It is a union containing function pointers,
       * object pointers, and a structure that resembles a bound
       * member function pointer.
       
*/

      union function_buffer
      
{
        
// For pointers to function objects
        mutable void* obj_ptr;

        
// For pointers to std::type_info objects
        struct type_t {
          
// (get_functor_type_tag, check_functor_type_tag).
          const BOOST_FUNCTION_STD_NS::type_info* type;

          
// Whether the type is const-qualified.
          bool const_qualified;
          
// Whether the type is volatile-qualified.
          bool volatile_qualified;
        }
 type;

        
// For function pointers of all kinds
        mutable void (*func_ptr)();

        
// For bound member pointers
        struct bound_memfunc_ptr_t {
          
void (X::*memfunc_ptr)(int);
          
void* obj_ptr;
        }
 bound_memfunc_ptr;

        
// For references to function objects. We explicitly keep
        
// track of the cv-qualifiers on the object referenced.
        struct obj_ref_t {
          mutable 
void* obj_ptr;
          
bool is_const_qualified;
          
bool is_volatile_qualified;
        }
 obj_ref;

        
// To relax aliasing constraints
        mutable char data;
      }
;

在下浅薄,不能完全明白其中的道理,还请路过高人指点。
 

 
记得以前也做过样的的东东,貌似是自己第一个PC程序呢,哈哈。
用C从头做起,能练练数据结构(主要是链表)。用C++/Java/C#等容器类,那就没什么搞头了,呵呵

re: STL Vector 的遍历删除. 唐风 2009-12-08 18:43
>code3 错误的原因为, vecFiles.erase(it_pos); 当前的it_pos已经被删除
>了, 再下一次循环的时候 it_pos++, 访问非法内存..

>然后回过头来看code1, vecFiles.erase(it_pos++); 在当前的it_pos已经被
>删除的时候, it_pos已经指向下一个位置了. 虽然这里逻辑上是错误的. 但是利
>用c语法的特性产生了一个正确的结果, 算是一个技巧. 不算是一门技术.

我对这种的说法有不同看法:
it_pos无所谓删除不删除,it_pos 的行为就像指针一样,指针本身不会被删除,被删除的是指针指向的内容。我想楼主可能对迭代器失效的理解有偏差(建议在网上查一查相关的资料再看看)
我觉得,code1、2、3没有什么本质区别,都有可能产生迭代器失效的问题。
一个原则:对vector只要做了删除或是增加动作,就要示迭代器已经无效,必须重新从vector对象获取新的迭代器的值,而不能用临时变量、后缀自增等方法……
remove_if+erase的版本才是可读性最好且没什么问题的。

个人愚见,请博主笑纳……



@陈梓瀚(vczh)
好吧,我只能说,是你自己在 cppblog 的链接中列出来的。哈哈哈哈 :P
阁下爱好很广嘛,编译原理狂人(别人这么叫你的) + 漫迷 ……

嗯嗯,凡有回复必回访是我的原则,哈哈,也是想通这这种途径了解对方,多交些朋友



@Wang Feng
确实如你所言。谢谢你的回复。

说实话,“并行计算”这种高级货,我还真没玩过,嘿嘿。

嗯嗯,真心求教:
这方面有没有比较好的已经成熟的做法(库?)?能不能介绍一下?如果一个表达式比较复杂(比如有加减乘、有括号之类)有什么算法能正确地最优地根据可以并行的“行程”数来分配计算子过程?各子过程的之间的“通信”是怎么做的呢?会像一般“多线程”中的锁机制那样吗(当然,我对锁这东西的理解也限于“理论”范畴内,呵呵)?

PS:
刚才回访了你的 blog,里面大多都是算法方面的东西啊,呵呵。向你学习 :D




@YESHG!
你也注册一个博客园(或是cppblog)的帐户呗
对评论和回复有邮件通知,这个功能挺好用的。
re: 听Lippman讲座 唐风 2009-12-05 19:56
【他只是谦虚地说:他只是对C++比较了解,在其他领域,他可能还不如在座诸位。】
光这一点就让我肃然起敬。
@OwnWaterloo

operation proxy……

好形象啊,哈哈
你上篇的回复里就说到了这个呢,不过我是事后才认识到……:P

@YESHG!
谢谢老大支持!!

配合内联 RVO,很多情况下这些临时小对象也可以消失,你看看我上面回复中给的链接,MS 有说明……

至于不习惯模板,嘿嘿,吐啊吐啊就习惯了。:)

@陈梓瀚(vczh)
嗯嗯,好敏锐啊,你说得很对。
d=a+(b+c);
这种在这段程序里是会产生编译错误的……

这个模板类确实非常的不完善,对于一个“可用”的ExpXXX的话,应该要是左右操作数都需要泛化的。为了进一步的重用,可以再泛化操作类型(加减乘)。

这篇文章里我想把重点放在“它可以消除临对象上”,为了能更“简单”地说明ET,所以写的例子很简陋,不过我想大概的做法已经点到了。

完善的做法比较复杂,所以我认为这个库设计都用的武器,写应用层逻辑时也许不太会用到?(调试、维护都不容易啊……)

下面有一篇文章,从头开始一点一点地完善这个ExpXXX,讲解得非常细~,每一个改善是为了什么!(不过是日文的,嘿,YESHG,为你准备的!中文英文的应该也有,不过我没搜到这么细致的,呵呵,不过对《C++templates》里的例子应该也够看了。)
http://homepage1.nifty.com/herumi/prog/prog81.html#MOTIVATION

PS:
至于那个囧类型,我还没看到有什么好的做法。因为要让左右操作数接受不同的表达式(a,a+b,a+b*c等等等等)才可用,所以操作数的“类型”不能固定,ExpPlus<I>+ExpPlus<I>==ExpPlus<I>,感觉行不通。你有什么好做法呢?

@OwnWaterloo
呃,不好意思,我是想说“盗版”,呵呵
回想,DB 确实容易联想成 DataBase,那这句话就不好理解了……
It's my fault :)


@non
是有听这么说的。
不过我总觉得:不鼓励或是要求禁用 STL 的组织,肯定得要有牛人实现一套更合适于他们工程的基本类库,也许他们只是不想要通用的 STL 实现,但 STL 做的那些事,始终还是需要有“人”来做的。
话说 VC6 还真有点像 IE6 ,拥有极高的使用率,但又不能完全支持“标准”,呵呵,不过 VC6 可以原谅,毕竟开发的时候 C++ 标准还没出台嘛……

唉,托 D 版的福,我可是每发布一个新版本就立即升级的,呵呵,不过在公司做项目又没办法了,得听公司技术决策者的,呵,而我们公司那个大牛,MS 习惯 VC6 ……。

我也很期待 C++0x 呢,对 C++ 很有感情,哈哈

对于
【没有右值引用,也可以消除很多临时变量,只是编程很复杂……】
是啊,但通过这些途径,完成了一些“目标”之后仍然会觉得心中有缺憾,不能用最优雅的方式解决问题的时候总会不舒服,
就像 Expression Template 被开发出来,我想也是人们想有效率,又想直观的结果吧……

PS:
您还真是快啊~~我这才发布,你就来了。神仙~
re: 函数调用栈初探 唐风 2009-11-27 19:49
谢谢你的提醒啊~!
呵呵,这两天跑去看 WinDbg 的扩展命令去了,企图看能不能通过写 WinDbg 的扩展来达到目的……有点头大的说,哈哈。

RednaxelaFX 这个“家伙”也是个神人,我在 JavaEye 上第一次发表这篇文章的时候就有他的回复,相信是同一个人,嘿嘿。(他在 JavaEye 上有关于 JavaScript 运行机制的文章,看得出是很有几把刷子的)

跑来跑去,发现世界挺大,圈子确挺小,哈哈哈哈 :P

嗯嗯,是够长的,明天早起好好看,嘿嘿!!

PS:
>>你本来写的是【quote】吧? cnblogs确实很偏心,cppblog确实是穿小鞋的……
确实是的,唉……
这段时间在通过 CSS 和 JS 脚本在配置 cnblogs 的博客,已经比较满意了,嘿嘿。
@OwnWaterloo
是的啊,正好我也在“回味”,哈哈,准备作为那篇 SFINAE 随笔的补充,加一些 enable_if 的笔记……

对于 enable_if 的还有一个比较舒服的功能点是:
boost::disable_if<boost::is_class<T>, DataFromFile&>::type
这个可以放返回值的位置上生效,并且让条件满足时使用DataFromFile&作为返回类型,其它情况下让它 Substitution fail,而不对程序产生“负面影响”。

真是非常体贴啊,因为在这个地方,运算符重载的参数个数是有限制的,不能随意增加,所以在这里不能直接在参数表中加 T::* p = 0 之类的东西来运用 SFINAE。


re: 函数调用栈初探 唐风 2009-11-22 12:54
>>问题就在于这个前提是没有保证的。编译器处理尾调用时可以使用jmp而不用call。这种情况在msvc和gcc上都存在。
哦哦,原来还有这种情况,呃,如果是在 debug 模式下,优化全关呢?嗯,找个时间我再也看看。

>>或者其他profile工具是怎么做的?
这倒是,以前没想到这个可以做参考呢,嗯,谢谢提醒。


真是独学而无友,则孤陋而寡闻。

PS:
一连两天看到你抢占沙发长篇回复,果然是神人啊……
什么时候我够格能和你“论战”一番而后双方受益,倒是可以“含笑九泉”了,:)

学习中……

re: 函数调用栈初探 唐风 2009-11-21 17:39
@OwnWaterloo
调试器没有符号表的情况下应该也能工作,但给出来的信息是“人类不可读”的。

一直在找一种方法,希望能实现这样的需求:
给出两个断点,当程序停在第二个断点的时候,希望得到在之期间被调用过的函数的列表(按时间顺序)。
当然,希望这个方法是非侵入性的。
栈信息显然是不够的,某一时刻的栈信息只有被断点函数的上层函数信息,但可以肯定的是每个函数调用都会有压栈出栈,能不能设置一个类似“勾子”的东西,在CPU进行压栈的时候记录下某些信息呢?

@OwnWaterloo
谢谢推荐,说起来,C++ 的书读了不少,不过 BS 老爷子的《the c++ programming language》还真是没看过……惭愧,回头找来啃一啃。
《标准C++输入输出流与本地化》这本书看了前两章都看不下去了,实在有点无趣,倒是《C++ standard library》中IO部分看几回,但本地化还是没搞明白。

PS:
说到 log 模块,觉得还是蛮有用的,就现在手头上做的项目来说,如果没有这东西,所有模块的 log 信息不受任何控制的话,光是这些 log 的通信就能把机器卡死(因为机器与PC的是串口连的)……
觉得对于大一点的软件(虽然我只接触了一个)来说,系统自身的调试机能和控制都蛮重要。
共2页: 1 2