概述
目录
理论
演示
理论
刚刚看了大佬的代码,发现某大佬用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显得简洁美观,他内部干了很多的事情。
最后
以上就是秀丽保温杯为你收集整理的C++工作笔记-for与foreach之间的初步比较(反汇编初步窥探) 理论演示的全部内容,希望文章能够帮你解决C++工作笔记-for与foreach之间的初步比较(反汇编初步窥探) 理论演示所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复