C++工作笔记-for与foreach之间的初步比较(反汇编初步窥探)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/88527885

目录

 

 

理论

演示


 

理论

刚刚看了大佬的代码,发现某大佬用QList的时候,喜欢使用foreach,而我这个小弱鸡使用QList的时候,喜欢使用for循环。

下面给出个人对这两个用法的初步窥探,并不是对其效率的分析。只是个人对其内部的初步研究!

演示

如下的源码:

#include <QApplication>
#include <QList>
#include <QString>
#include <QDebug>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QList<QString> list;
    list << "one data" << "two data" << "three data" << "four data" << "five data" << "six data" << "seven data";

    //for
    for(int i = 0; i < list.size(); i++){

        qDebug() << list[i];
    }

    qDebug() << "----------------------华丽的分割线----------------------";

    foreach (QString str, list) {

        qDebug() << str;
    }

    return a.exec();
}

程序的运行截图如下:

从外观上来看foreach用法的确是简洁很多。

for循环在其面前就显得比较臃肿。

目前估计是foreach中有个迭代器,给str赋值,才使得其用法简单,看起来也简洁

把他放到vs中,进行反汇编!

for循环代码如下:

for循环中qDebug相关的就去掉了!

下面来分析下这个for循环:

          1. 把o赋值给ptr指向的地址,大小为dword(双字即为4个字节);
          2. 把指令跳转到指定的地址;
          3. 把ptr刚刚指向的地址的值给eax;
          4. 再把eax寄存器里面的值+1;
          5. 把eax寄存器里面的值写回ptr执行的地址,大小为dword(双字即为4个字节);
          6. 将目前list中的值(带上偏移)给ecx
          7. 得到QList的大小;
          8. 将eax的值和QList的大小相减,只响应标志位。
          9. 如果标志位为0循环结束,跳到指定位置。

          10. 随后是qDebug() << list[i]的,在此不分析;
          11. 但最后的jmp main+181h(0F4E468H)可以看到他跳到了第二条,这也是为什么,for循环中,int i = 0只会调用一次的原因;

下面是foreach,因为个人能力原因,在此不再一行一行的分析:

从中可以看到foreach中的确是用了个迭代器,通过这个迭代器进行判断,和赋值给str。

难怪使用foreach显得简洁美观,他内部干了很多的事情。

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/88527885