帮忙看下这个问题

发布于 2022-10-15 08:31:56 字数 2198 浏览 26 评论 0

对于循环里的临时变量问题,我一直认为是把临时变量放在循环体外效率会高,可以节省构造与析构的时间。但这次做了测试发现,情况与我认为的刚好相反。

本例使用Qt的QTransform,就是一个矩阵的类做乘法运算,两段代码的执行效率,是在循环体内定义临时变量的效率高.当然是直接将乘法结果赋给临时变量的情况.

无论打开还是关闭优化,还是加上-g去掉-g,都是一样的结果.

有人详细的解释一下么,C++primer里说过这个问题,但不是太明白.

  1. [iscs@linux-sp1]:/users/iscs/test>$ cat qmain.cpp
  2. #include <QtGui/QTransform>
  3. int main(int argc, char* argv[])
  4. {
  5.         const QTransform m1(1.3, 424, 643, 545, 2234, 13.4, 123, 678, 98);
  6.         const QTransform m2(1.3, 424, 643, 545, 2234, 13.4, 123, 678, 98);
  7. #ifdef TEST
  8.         for(int i=0; i<10000000; ++i)
  9.         {
  10.                 QTransform ss = m1*m2;
  11.         }
  12. #else
  13.                 QTransform ss;
  14.         for(int i=0; i<10000000; ++i)
  15.         {
  16.                 ss = m1*m2;
  17.         }
  18. #endif
  19.         return 0;
  20. }
  21. [iscs@linux-sp1]:/users/iscs/test>$ g++ -m32 -I/users/iscs/qt/include/ -L/users/iscs/qt/lib -lQtGui -o ss qmain.cpp -O2 -DTEST
  22. [iscs@linux-sp1]:/users/iscs/test>$ time ./ss
  23. real    0m0.518s
  24. user    0m0.504s
  25. sys     0m0.004s
  26. [iscs@linux-sp1]:/users/iscs/test>$ g++ -m32 -I/users/iscs/qt/include/ -L/users/iscs/qt/lib -lQtGui -o ss qmain.cpp -O2
  27. [iscs@linux-sp1]:/users/iscs/test>$ time ./ss
  28. real    0m0.625s
  29. user    0m0.616s
  30. sys     0m0.000s
  31. [iscs@linux-sp1]:/users/iscs/test>$

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

单调的奢华 2022-10-22 08:31:56

建议看看每次循环 缺省构造、拷贝构造、析构函数的执行次数

别靠近我心 2022-10-22 08:31:56

        for(int i=0; i<10000000; ++i)
        {
                QTransform ss = m1*m2;

        }

这里是直接调用构造函数,类的初始化。

  1.                 QTransform ss;
  2.         for(int i=0; i<10000000; ++i)
  3.         {
  4.                 ss = m1*m2;
  5.         }

复制代码这里是调用类的重载运算符“=”,是不一样的,估计不同效率在这里。

落墨 2022-10-22 08:31:56

回复 3# sigmalha

    回答正确。佩服佩服.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文