区间for迭代 类似于 java 中的 for each 看个例子: 数组的区间 for 迭代 我们从第一行开始看,首先把数组 a 的地址放到 eax 中,再把 eax 的值放到 [ebp-28h] 中,也就是 [ebp-28h] 存储了元素的首地址,同理 [ebp-34h] 也存了 a 的首地址(这里 猜测可能是多个变量存一个值?),然后 eax 加 14h 也就是 eax 存储了 a 元素最后一个 元素后一个 “ 元素 ” 的地址,用于设置循环次数,存储于 [ebp-40h] 。 之后无条件 近转移 跳转到 009F27E5 mov eax,dword ptr [ebp-34h] ,把 a 的首地 址存入 eax 然后判断 eax 中的值是否大于 a 数组最后元素的地址(越界判断),若越界,则直接 跳出 for 循环。 然后把 [ebp-34h] 也就是 a 首地址放到 eax 中,然后把 eax 中对应 a 数组元素的值放到 ecx 中,再把 ecx 的值放到 [ebp-4Ch] 中,其中 [ebp-4Ch] 存的就是 x 的地址。 之后执行 for 循环体的语句,然后跳转到 009F27DC mov eax,dword ptr [ebp-34h] 后面循环中, [ebp-34h] 存的是当前循环到元素的地址, [ebp-40h] 变量用于控制循环 次数, [ebp-4Ch] 存储 x Lambda表达式 Lambda 表达式是现代 C++ 中最重要的特性之一,而 Lambda 表达式,实际上就是 提供了一个类 似匿名函数的特性,而匿名函数则是在需要一个函数 考虑以下代码: 这里定义了一个 lambda 函数,值捕获 value 变量,在定义完 res lambda 函数后,修改 value = 10 ,最后调用 res 函数时,仍然输出 100 , 因为 res 在创建时就保存了一份 value 的拷贝 。 反汇编: 可以看到,创建 res 匿名函数时,首先把 value 变量的地址存储起来,压栈当成参 数,并调用 lambda 的构造函数,在构造函数里面自动复制了一份 value ? 调用 res 时,实际上时调用 lambda 类型 res 的 operator 函数,调用过程与普通函数相 似。 再考虑以下代码,这次使用的是引用捕获 输出的结果是 1000 ,说明最后调用 res() 时候,用的是没有拷贝的值。 显然值捕获和引用捕获的调用时候,反汇编编代码相同 我们来看看他们两个的 lambda 构造函数 引用捕获 值捕获: 显然值捕获里面,多了一条汇编指令,结合上下文,相比引用捕获,可以得知这里 多复制了一份 value 的值。 我们再看看两种捕获方式下,调用 res operator 函数也就是 res lambda 函数体的反汇 编,(第一张图为值传递) 可以看到(倒数几行不同),值捕获直接把自己存好的 value 拿出来乘上 100 ,并没 有利用原来的 value 待更新TODO
标签:11,20,14,res,捕获,value,eax,ebp,函数 From: https://blog.csdn.net/u011169466/article/details/141994253