win10 + vs2017

源码如下:

int main()

{

  vector< int > numbers = { 1, 2, 3, 4, 5 };

  for (auto num : numbers)

  {

    printf( "num = %d\n", num );

  }

  return 0;

}

汇编理解如下:

int main()
{
# 入栈
00933F63  sub         esp,150h  
00933F69  push        ebx  
00933F6A  push        esi  
00933F6B  push        edi  
00933F6C  lea         edi,[ebp-150h]  
00933F72  mov         ecx,54h  
00933F77  mov         eax,0CCCCCCCCh  
00933F7C  rep stos    dword ptr es:[edi]  
00933F7E  mov         eax,dword ptr [__security_cookie (093E004h)]  
00933F83  xor         eax,ebp  
00933F85  mov         dword ptr [ebp-4],eax

vector< int >    numbers = { 1, 2, 3, 4, 5 };

// memset( &numbers, 0x00, sizeof ( numbers ) );
// sizeof ( numbers ) == 10h
00933F88  push        10h  
00933F8A  lea         ecx,[numbers]  
00933F8D  call        std::vector<int,std::allocator<int> >::__autoclassinit2 (09314ABh)

// [ebp-14Ch, ebp-138h) 这段内存是5个整形(20个字节),分别赋值为1,2,3,4,5
00933F92  mov         dword ptr [ebp-14Ch],1  
00933F9C  mov         dword ptr [ebp-148h],2  
00933FA6  mov         dword ptr [ebp-144h],3  
00933FB0  mov         dword ptr [ebp-140h],4  
00933FBA  mov         dword ptr [ebp-13Ch],5

// 创建allocator对象,供后面vector构造使用,地址为 ebp-111h
00933FC4  lea         ecx,[ebp-111h]  
00933FCA  call        std::allocator<int>::allocator<int> (0931163h)  
00933FCF  push        eax

// std::initializer_list<int> 构造
// initializer_list(const _Elem *_First_arg, const _Elem *_Last_arg)
00933FD0  lea         eax,[ebp-138h]  
00933FD6  push        eax  
00933FD7  lea         ecx,[ebp-14Ch]  
00933FDD  push        ecx  
00933FDE  lea         ecx,[ebp-124h]  
00933FE4  call        std::initializer_list<int>::initializer_list<int> (09314A6h)

// vector 构造
// vector(initializer_list<_Ty> _Ilist, const _Alloc& _Al = _Alloc())
// _Al参数是在 00933FCF 位置压栈的
// _Ilist参数是按值传递,将成员_First和_Last分两次压栈,对应下面4行
00933FE9  mov         edx,dword ptr [eax+4]  
00933FEC  push        edx  
00933FED  mov         eax,dword ptr [eax]  
00933FEF  push        eax  
00933FF0  lea         ecx,[numbers]  
00933FF3  call        std::vector<int,std::allocator<int> >::vector<int,std::allocator<int> > (0931168h)

for (auto num : numbers)

// std::vector<int,std::allocator<int> >::begin() 结果保存在 dword ptr [ebp-30h]
00933FF8  lea         eax,[numbers]  
00933FFB  mov         dword ptr [ebp-24h],eax  
00933FFE  mov         ecx,dword ptr [ebp-24h]  
00934001  call        std::vector<int,std::allocator<int> >::_Unchecked_begin (09311FEh)  
00934006  mov         dword ptr [ebp-30h],eax

// std::vector<int,std::allocator<int> >::end() 结果保存在 dword ptr [ebp-3Ch]
00934009  mov         ecx,dword ptr [ebp-24h]  
0093400C  call        std::vector<int,std::allocator<int> >::_Unchecked_end (09312C1h)  
00934011  mov         dword ptr [ebp-3Ch],eax

// 跳转 for 循环的条件比较
00934014  jmp         main+0BFh (093401Fh)

// 迭代器加1
00934016  mov         eax,dword ptr [ebp-30h]  
00934019  add         eax,4  
0093401C  mov         dword ptr [ebp-30h],eax

// eax = dword ptr [ebp-30h]
// eax 和 vector::end() 比较,如果相等则跳出循环
0093401F  mov         eax,dword ptr [ebp-30h]  
00934022  cmp         eax,dword ptr [ebp-3Ch]  
00934025  je          main+0E2h (0934042h)

// 将 dword ptr [ebp-30h] 迭代器指向的整形数值取出来,放到 dword ptr [ebp-48h]
00934027  mov         eax,dword ptr [ebp-30h]  
0093402A  mov         ecx,dword ptr [eax]  
0093402C  mov         dword ptr [ebp-48h],ecx  
    {
        printf( "num = %d\n", num );

// 从 dword ptr [ebp-48h] 取出整形数值,压栈
// 将 "num = %d\n" 压栈
// 调用 printf
0093402F  mov         eax,dword ptr [ebp-48h]  
00934032  push        eax  
00934033  push        offset string "num = %d\n" (093BC88h)  
00934038  call        _printf (093153Ch)  
0093403D  add         esp,8  
    }

// 跳转到迭代器加1位置
00934040  jmp         main+0B6h (0934016h)

return 0;
00934042  mov         dword ptr [ebp-130h],0

// vecotr析构
0093404C  lea         ecx,[numbers]  
0093404F  call        std::vector<int,std::allocator<int> >::~vector<int,std::allocator<int> > (0931078h)

// 将返回值0放入eax寄存器
00934054  mov         eax,dword ptr [ebp-130h]  
}

// 出栈
0093405A  push        edx  
0093405B  mov         ecx,ebp  
0093405D  push        eax  
0093405E  lea         edx,ds:[93408Ch]  
00934064  call        @_RTC_CheckStackVars@8 (09313F7h)  
00934069  pop         eax  
0093406A  pop         edx  
0093406B  pop         edi  
0093406C  pop         esi  
0093406D  pop         ebx  
0093406E  mov         ecx,dword ptr [ebp-4]  
00934071  xor         ecx,ebp  
00934073  call        @__security_check_cookie@4 (0931415h)  
00934078  add         esp,150h  
0093407E  cmp         ebp,esp  
00934080  call        __RTC_CheckEsp (0931212h)  
00934085  mov         esp,ebp  
00934087  pop         ebp  
00934088  ret

转载于:https://www.cnblogs.com/duanjj0929/p/10485884.html

C++11 initializer_list 和 Range-based for loop 学习理解相关推荐

  1. using(别名)和range based for

    using(别名)替代typedef 关键字 using 语法 别名声明是具有下列语法的声明: using 标识符 attr(可选) = 类型标识 ; (1) template < 模板形参列表 ...

  2. range python命令_Python学习笔记(一)

    python的安装 linux系统自带python python的进入 终端输入python回车即可 python的退出 >>>exit() 或 Ctrl-D 第一个命令 单双引号无 ...

  3. 【AMD显卡在WIndow10/11部署带GPU支持的深度学习环境(Tensorflow-DirectML篇)】

    全中文网首发,可以收藏本教程纪念一下 还有个姊妹篇Pytorch版,请翻阅我的博文! 我这先晒一个结果: 首先这里推荐的系统比如Win10不要太老,尽量新一点,特别是针对WSL2 本人用的显卡是AMD ...

  4. Windows 11 上从零开始基于 wsl-ubuntu 搭建 AI 学习环境及部署多种私有 ChatGPT

    Windows 11 上从零开始基于 wsl-ubuntu 搭建 AI 学习环境及部署多种私有 ChatGPT 0. 背景和简介 1. 安装 wsl-ubuntu 2. (可选)配置清华大学软件源 3 ...

  5. 跟着 Event loop 规范理解浏览器中的异步机制

    原文发自我的 GitHub blog,欢迎关注 前言 我们都知道 JavaScript 是一门单线程语言,这意味着同一事件只能执行一个任务,结束了才能去执行下一个.如果前面的任务没有执行完,后面的任务 ...

  6. 2015.12.08-2015.12.11 硕士毕业大论文 前端技术学习

    毕业大论文:本周完成第二章:异步电机故障诊断机理分析 第二章 基于HHT的电机故障特征提取 前端技术学习:完成书本 第10章 DOM 12.08 异步电机故障诊断机理分析&DOM10.1.1 ...

  7. python range倒序_Python算法学习之堆和堆排序

    什么是堆? 堆是一种完全二叉树(请你回顾下上一章的概念),有最大堆和最小堆两种. 最大堆: 对于每个非叶子节点 V,V 的值都比它的两个孩子大,称为 最大堆特性(heap order property ...

  8. 11步,教你创建深度学习聊天机器人

    全文共4687字,预计学习时长9分钟 创建一款聊天机器人时,目标应该是令其仅需最少的人类干预甚至无需人类干预.这一目标可通过两种方法实现. 第一种方法是,客服团队接收来自人工智能的建议,以改进客户服务 ...

  9. 涵盖从Java 5到Java 11所有重要特性,让Java学习不再难!

    曾经,网络上流传着这样一套视频,无数学员通过这套视频学会了Java,进入了软件开发领域~~ 这套视频就是"Java无难事". 如今,为了方便大家更好地学习,也跟上当前Java发展更 ...

最新文章

  1. linux高级编程有作用吗,Linux 高级编程
  2. richtextbox自动滚动到最下面_自动滚动式连续真空包装机简介
  3. iis php5.4配置_IIS 8+PHP5.4+SQL server2012配置
  4. 10、angular的全部api
  5. yolo人脸检测数据集_自定义数据集上的Yolo-V5对象检测
  6. 数据库原理及应用教程课后习题答案 第4版 微课版 陈志泊主编
  7. java基于SSM的疫情物业系统源码
  8. 团队任务1:第一次团队会议
  9. 内网入口——代理搭建端口转发
  10. 解决群晖 “由于系统可用存储空间不足,您将无法登录“ 的问题
  11. Fidder 请求信息颜色的含义
  12. 零基础新手小白学编程必会的100个代码
  13. 银行家算法资源分配问题(例子!!!)
  14. 基于WT2003H语音芯片在LCD屏幕驱动的应用实例解析
  15. Python灰帽子笔记二
  16. matlab实现ica,Matlab用ICA进行话语分离
  17. HTML5+CSS3+JS实现满屏下雪效果
  18. 正版计算机软件识别方法,微软正版软件如何识别?
  19. 5月31日服务器维护更新公告,5月31日服务器维护公告 家园新增许愿星功能
  20. 鸿蒙系统操作界面跟苹果很像,鸿蒙系统逻辑近似苹果iOS13?这华为在搞什么?...

热门文章

  1. 机器学习之异常点检测
  2. 请求数据分析 xpath语法 与lxml库
  3. 什么是Java Marker Interface(标记接口)
  4. docker基础命令
  5. Python递归调用
  6. ubuntu14.04下apt-get install出现E: Sub-process /usr/bin/dpkg returned an error code 解决方法
  7. linux一路填坑...
  8. 50佳设计独特的名片设计欣赏(上篇)
  9. Linux下的XAMPP基本配置技巧(设置虚拟主机、添加FTP账户等)
  10. ubuntu 挂在smb服务器的方法