首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • linux下的一个c/c++的问题……信息显示顺序会颠倒?! [已结帖,结帖人:21bird]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 21bird
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-11-06 18:38:12 楼主
    linux,使用了expat和ace(个人比较看好ace的调试宏输出:))

    情况大概是这样的:
    main.cpp内容:

    C/C++ code
    static void XMLCALL startElement(void *userData, const char *name, const char **atts) { fprint(...);//输出节点内容 } static void XMLCALL endElement(void *userData, const char *name) { .... } main() { ...//调用expat解析一句xml,完毕后释放所有expat资源。 //用ace输出结束信息 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Normal shutdown.\n"))); }


    一切正常,可是……换个做法……
    增加个class A之后……

    A.cpp内容:
    C/C++ code
    static void XMLCALL startElement(void *userData, const char *name, const char **atts) { fprint(...);//输出节点内容 } static void XMLCALL endElement(void *userData, const char *name) { .... } A::Do() { ...//调用expat解析一句xml,完毕后释放所有expat资源。 } main() { A a; a.Do(); //用ace输出结束信息 ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("Normal shutdown.\n"))); }


    这样也不出错,可是有个奇怪的现象。
    输出结果竟然变成了:
    C/C++ code
    Normal shutdown. ....//xml解析内容


    就是说,明明应该在最后一句的信息竟然跑到前面去了……
    而且我发现,如果ace宏换成用std::cout就没问题了……纳闷中……有人给解释下不?
    38  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xhs_lh04
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-06 18:46:281楼 得分:2
    呵呵不可能吧,我也在LINUX下用ACE_DEBUG,从没发现会输出调个呀
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yzfyzyl
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-06 18:48:442楼 得分:10
    哈,比这更郁闷的偶也遇到过,偶增加一个完全无关的一个类定义,
    其它代码也没有使用那个类,却使程序执行效率高了几倍

    你的问题属于C/C++混合输出,这样会使输出顺序不可预知的



    飞燕算法群:46520219
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xhs_lh04
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-06 18:48:503楼 得分:0
    难道不成在A释放的时候才会去调Do不成,不解呀
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • zmlovelx
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-06 19:19:194楼 得分:0
    我用的是code::block
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xiaopoy
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-06 19:57:285楼 得分:0
      a.Do()后执行了?
    不懂,纯顶
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 21bird
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 08:56:506楼 得分:0
    a.Do()后执行了?

    当然执行了,我还特意验证了下,
    特意在输出解析内容后又调用了那个类的另一个方法,结果没出错,有成功执行的信息,
    这就证明了:显示解析结果的时候,那个类是正常存在的,还没被释放掉……

    个人估计是ace的管理器的搞的……ace_debug可好像不是简单的宏定义哦……
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xhs_lh04
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 09:03:547楼 得分:2
    ACE你看下宏定义,是向日志服务输出,如果日志服务没启动才会向屏幕输出,但它也不应该先输出啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 21bird
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 09:11:158楼 得分:0
    啊~~~~帖子内容说错了一点:输出内容用的是printf而非fprint...汗~

    还有更奇怪的呢:
    偶在ace_debug前随便std::cout点东西,顺序就正常了……晕~
    前面的代码那么多的std::out……偏偏要加在这才……

    最后结果就是,printf换成ace_Debug,顺序正常,哈哈……
    其实这是没完全修改好代码之前发现的现象,本来就打算全用ace_debug的,
    因为可能要变成后台执行,ace_debug可以直接重定向到日志去……

    个人的结论就是:printf也不如ace_debug快……(如果说对了,就是蒙对了,如果说错了,就是玩笑,哈哈)
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 21bird
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 09:20:169楼 得分:0
    to 7楼的朋友:
    ace_debug默认输出到显示器,我还没写重定向到日志的代码呢……

    说正经的,个人认为:可能是ace_debug没有使用输出缓冲,而printf则用了输出缓冲……
    另一个佐证是,ace_debug输出到显示器的内容,一般是不可以在命令行用>>重定向的……
    目前还不太了解有关内部机制……希望没说错,哈~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 21bird
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 09:22:3810楼 得分:0
    引用 2 楼 yzfyzyl 的回复:
    偶增加一个完全无关的一个类定义,
    其它代码也没有使用那个类,却使程序执行效率高了几倍

    应该是这样导致编译器做了其他相关优化吧?这你都能看出来?!pf,哈哈
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • redleaves
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-07 10:13:1411楼 得分:24
    引用 10 楼 21bird 的回复:
    引用 2 楼 yzfyzyl 的回复:
    偶增加一个完全无关的一个类定义,
    其它代码也没有使用那个类,却使程序执行效率高了几倍

    应该是这样导致编译器做了其他相关优化吧?这你都能看出来?!pf,哈哈

    对于这个问题,我曾经研究过....编译器的优化并没有变.但代码在内存里的布局变了.这会导致cache命中产生变化...
    GCC上,这个现象最明显.其它的编译器也有这种问题.这还好,最让人郁闷的是同样的代码,前几次运行都比较快,后几次就比较慢.以后只会偶尔快一小下....还有,同样的代码,把函数的顺序换一下,速度也有很大的变化....
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • 21bird
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-11-18 10:43:5112楼 得分:0
    虽然没有得到真正的答案,可各位说的也很有用,所以照常结帐……^o^
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved