vc编译器对 除法的优化
基本知识,7/2 和 6/2 在计算机中的商都为3.C语言的除法不等同于数学意义中的除法。
C语言的除法。采用向零取整的方法。
-______________0_______________+
只有在除数为常量的情况下。编译器才会出现优化。
1、除数为正数,2的幂的除法
#include "stdafx.h" int main(int argc, char* argv[])
{
int iNum = argc;
printf("%d\r\n", iNum / );
printf("%d\r\n", iNum / );
return ;
}
对应Release版本的反汇编如下:
push esi
mov esi, dword ptr [esp+]
mov eax, esi
cdq
sub eax, edx
sar eax,
push eax
push test. ; ASCII "%d",CR,LF
call test.
mov eax, esi
add esp,
cdq
and edx,
add eax, edx
sar eax,
push eax
push test. ; ASCII "%d",CR,LF
call test.
add esp,
xor eax, eax
pop esi
retn
是不是感觉很奇怪,怎么没有了除法指令。查阅CPU手册。除法的指令周期数。大得吓人。具体值得根据cpu型号。翻阅 手册。
所以。编译器想尽办法。就是为了避免产生除法。提高效率。
mov esi, dword ptr [esp+]
mov eax, esi
cdq
sub eax, edx
sar eax,
cdq 是把符号位扩展到 edx. 然后做加法。我们知道。对于被除数为正的情况,其值不变。除以2的幂。等于做 sar右移。
对于被除数为负的情况。那么由于sar右移。等同于向下取整。由于C语言是向零取整。所以。必须想办法下整转上整。就满足了C语言的向零取整。
于是公式来了。 a为被除数,n为2的幂. (a + 2^n - 1)/2^n
对于 iNum / 2 那就是等于 (iNum + 2 - 1)/2 。常量折叠。等于(iNum + 1)/2。除以2等于sar右移一位。
那么就完美解决了除以2且无分歧的优化。指令的总周期。相对于div指令要减少很多。
在按照公式推导 iNum /4 的情况。(iNum + 2^2 - 1) / 2^2 。常量折叠。等于(iNum + 3) / 4。除以4等于sar右移两位。
对应的汇编代码如下。
mov eax, esi
cdq
and edx,
add eax, edx
sar eax,
推荐本书籍:《C++反汇编与逆向分析技术揭秘》。
国内第一家从事软件逆向工程师培训的机构。http://www.51asm.com 强烈推荐!
vc编译器对 除法的优化的更多相关文章
- 深入探究VC —— 编译器cl.exe(2)
这一章节介绍的全是VC编译器选项,option参数是cl.exe的编译选项,是cl.exe命令行参数中最复杂.也是最常用的.下面介绍一些常用的编译选项: 1.代码生成有关 这些选项将影响编译完成后生成 ...
- qtcreator添加绿色版VC编译器
在不装VS的情况下为qtcreator添加VC编译器和调试器 首先假设在D盘有VC6,VC2002,VC2003,VC2005,VC2008,VC2010,VC2013等绿色版的VC编译器,编译器的的 ...
- C# 编译器对局部变量的优化
C# 编译器对局部变量的优化 C# 的编译器可以对代码进行优化,所以,我们在写代码的时候,可以更多地考虑一下代码的易读性问题. 不考虑基本的对齐和换行美化.看一下局部变量优化问题. C# 示例代码 例 ...
- 深入探究VC —— 编译器cl.exe(1)
cl.exe的功能是将源代码文件编译为可提供链接器使用的obj对象文件.cl.exe命令行参数形式如下: CL (option...) file... [option | file]... [lib. ...
- 1.在VC编译器下面为什么每个头文件以及源文件都要包含“stdAfx.h”,那么stdAfx.h中到底存放了什么,用来做什么?
我们知道在windows平台下面很多的文件后缀名中都含有Afx,其实Afx是微软公司的一个技术研发团队名称,vc下的“stdAfx.h”和“stdAfx.cpp”文件就是有他们所研发出来的,为什么要这 ...
- Java编译器的2点优化
优化1 对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含地为我们补上一个(byte)(short)(char). 如果没有超过左侧的范围 ...
- java9的JShell小工具和编译器两种自动优化
一.按顺序逐步执行的脚本程序: 二.编译器自动优化 1.不超数据类型范围编译器自动添加强转操作: 2.一但发生运算,byte/short/char都会自动提升为Int,当只有常量参与运算时,编译器会先 ...
- 【原创】Java编译器对String的优化
首先看以下的代码: public static void main(String[] arge) { String str1 = new String("1234"); Strin ...
- vc编译器 msvcr.dll、msvcp.dll的含义和相关错误的处理
转自:http://blog.csdn.net/sptoor/article/details/6203376 很久没有写程式设计入门知识的相关文章了,这篇文章要来谈谈程式库 (Library) 连结, ...
随机推荐
- Python 的特性
Copyright © 1999-2019, CSDN.NET, All Rights Reserved 原 python面试题整理(一) 崔先生的博客阅读数:2402018-08-03 前言 ...
- CTYZ的树论赛(P5557 旅行/P5558 心上秋/P5559 失昼城的守星使)
总结 由于受中秋节影响,没能在比赛时间内切掉\(T3\) 思维难度\(T1<T2<T3\),代码难度\(T1>T2>T3\) P5557 旅行 显然跳到环上去后就可以直接模了, ...
- OpenFOAM显示残差
本文主要讲解两种方法用来显示OpenFOAM的计算残差,一种是采用OpenFOAM自带的foamMonitor来输出残差,另一种就是大家经常看见的采用pyFoam来输出残差.不管采用哪一种方法都必须安 ...
- Flink(一) —— 启动与基本使用
一.Flink概念 lambda架构 将离线计算和实时计算结合在一起,发挥离线计算准确率高.实时计算响应速度快的优势.缺点是,同一套逻辑要分别在两个模式下实现,存在代码冗余的问题. Flink特点 ( ...
- TextFX Notepad++
textFx Notepad++ - 国内版 Bing https://cn.bing.com/search?FORM=U227DF&PC=U227&q=textFx+Notepad% ...
- mount: unknown filesystem type ‘ntfs’ 解决方法
问题: mount –t ntfs /dev/sde1 /mnt/mount: unknown filesystem type ‘ntfs’ 这是由于CentOS release 6.6(Final) ...
- CentOS上安装GlassFish4.0
1. 安装jdk 2. 下载并安装glassfish4 [root@linuxidc ~]# mv glassfish-4.0-ml.zip /usr/share/glassfish-4.0-ml. ...
- 从0开始学爬虫3之xpath的介绍和使用
从0开始学爬虫3之xpath的介绍和使用 Xpath:一种HTML和XML的查询语言,它能在XML和HTML的树状结构中寻找节点 安装xpath: pip install lxml HTML 超文本标 ...
- 蒙特卡洛树搜索算法 —— github上的implement的原代码
首先在网上看到了关于蒙特卡洛搜索算法的介绍,如下: https://www.cnblogs.com/steven-yang/p/5993205.html 并从中发现了一个在GitHub上impleme ...
- 【转载】 我的Machine Learning学习之路
原文地址: https://www.cnblogs.com/steven-yang/p/5857964.html ------------------------------------------- ...