是频繁->..->..->xxx ; 还是定义一个前部分变量->xxx

0x554 2015-12-18 09:08:30
最近代码遇到这样一个问题

下面这段代码需要实现很多次

xx->yy->zz->uu

//而且指向深度还经常不一样

xx->yy->kk

我就想能不能这样

定义 tmp = xx->yy;
tmp->kk;
tmp->zz->kk;

上面的代码都是在一个函数中,并且有多个这样类似的函数,但是需要上万级的运行次数(调用函数),问一下这两种方式运行的效率问题
对于这种需要频繁->..->..->的地方有没有可以改进的呢?
...全文
104 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
0x554 2015-12-18
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
如果你生成Release版,两者没有区别。我猜。
恩,那在实际运行的时候 , 一个是指针的频繁指向(请原谅我这么俗的叫法),另一个是频繁的定义以代替减少了一点的指针指向,这两种效率上那种会更合适呢,哎,请原谅我的强迫症,我就是想还有没有办法进一步的从代码层面优化一下 赵老师能从代码运行实际行为帮我解一下惑么 献丑了,下面就是一直想优化的代码,这样的代码块不止一处

case 't':
    {
        ///判断上边是否为空
        if(ptop == nullptr)
            linkWithTopNode(insertNode,first);
        else
        {
            insertNode->ptop = new Top;
            insertNode->pbottom = new Bottom;

            Node * theTopPoint = insertNode->ptop->point;
            ///上面相互指向
            insertNode->ptop->point = this->ptop->point;
            insertNode->ptop->point->pbottom->point = insertNode;

            insertNode->ptop->setIsOk(first);
            insertNode->ptop->point->pbottom->setIsOk(first);
            ///下面相互指向
            this->ptop->point = insertNode;
            insertNode->pbottom->point = this;

            this->ptop->setIsOk(second);
            insertNode->pbottom->setIsOk(second);
        }
        break;
    }
0x554 2015-12-18
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
可以定一个变量暂时保存中间的指针或者最后需要的变量,太深的话还是会有一定效率开销的
那会是什么上面的开销呢 如果是定义一个变量保存中间值,那么相比于深度的使用指针,这两种怎么比较cpu或内存的开销呢
赵4老师 2015-12-18
  • 打赏
  • 举报
回复
如果你生成Release版,两者没有区别。我猜。
paschen 版主 2015-12-18
  • 打赏
  • 举报
回复
可以定一个变量暂时保存中间的指针或者最后需要的变量,太深的话还是会有一定效率开销的
0x554 2015-12-18
  • 打赏
  • 举报
回复
引用 11 楼 paschen 的回复:
重新规划结构体组成,如果实在很长,可以安排一下注释,你的这种还不至于会迷糊,WINDOWS中很多结构体也是一层套一层
恩恩,看来还是我见识短浅了,我的潜意识是觉得这样多的->总不太好,毕竟处女座总想弄干净点 . 改天想想用更好的结构体表达,谢谢你的回答:D
paschen 版主 2015-12-18
  • 打赏
  • 举报
回复
引用 10 楼 lileihuilileihui 的回复:
不是我不知道来一个中间变量能不能行..... 我就是问问大家若遇到如此代码,大家有没有什么好办法避免或者优化一下.大家不觉得这样写到了后期如果看的话会迷糊么。。。。。。
重新规划结构体组成,如果实在很长,可以安排一下注释,你的这种还不至于会迷糊,WINDOWS中很多结构体也是一层套一层
0x554 2015-12-18
  • 打赏
  • 举报
回复
不是我不知道来一个中间变量能不能行..... 我就是问问大家若遇到如此代码,大家有没有什么好办法避免或者优化一下.大家不觉得这样写到了后期如果看的话会迷糊么。。。。。。
赵4老师 2015-12-18
  • 打赏
  • 举报
回复
不要低估编译器生成Release版时优化代码的智商! 理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!
paschen 版主 2015-12-18
  • 打赏
  • 举报
回复
引用 3 楼 lileihuilileihui 的回复:
[quote=引用 1 楼 paschen 的回复:] 可以定一个变量暂时保存中间的指针或者最后需要的变量,太深的话还是会有一定效率开销的
那会是什么上面的开销呢 如果是定义一个变量保存中间值,那么相比于深度的使用指针,这两种怎么比较cpu或内存的开销呢[/quote] 去看汇编就知了 a->b->c->d->e : 需要要先取a的地址,然后得到b,然后再得到c.... 如果写成: p = a->b->c->d; // p->e; 之后每次用只需要用前面已经得到了的p值了
fefe82 2015-12-18
  • 打赏
  • 举报
回复
gprof callgrind
引用 6 楼 lileihuilileihui 的回复:
[quote=引用 5 楼 fefe82 的回复:] 自己跑个 profiler 试试。
profiler 没用过 linux上有类似的工具么[/quote]
0x554 2015-12-18
  • 打赏
  • 举报
回复
引用 5 楼 fefe82 的回复:
自己跑个 profiler 试试。
profiler 没用过 linux上有类似的工具么
fefe82 2015-12-18
  • 打赏
  • 举报
回复
自己跑个 profiler 试试。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧