i++ i+=1 i=i+1 汇编代码效率比较
2024-08-31 06:41:04
结论:一样。编译器和编译器之间可能有点区别但是程序不会变。
0x00
一直不清楚到底是因为懒还是真的为了效率,要把" i = i + 1 "写成" i++ "或者" i += 1 ",
今日闲来无事,尝试一下。
0x01
直接的赋值语句。
编译器:Dev-C++ 5.11
代码:
void asd() {}
int main() {
int i=;
i++;
asd(); //方便在IDA中区分上下文
i=i+;
asd();
i+=;
return ;
}
反汇编:
mov [rbp+i], 0 //i的初始化
add [rbp+i], 1 //i++;
call _Z3asdv ; asd(void)
add [rbp+i], 1 //i=i+1;
call _Z3asdv ; asd(void)
add [rbp+i], 1 //i+=1;
总结:一毛一样。
0x02
换个编译器
编译器:Microsoft Visual Studio 2013
代码:跟上边的一样
反汇编: //突然变得裹脚布
mov [ebp+i], 0 //i的初始化
mov eax, [ebp+i] //这三行是i++
add eax, 1 //先取出i放到eax,加1之后再放回去
mov [ebp+i], eax
call sub_41110E //void asd()
mov eax, [ebp+i] //这三行是i=i+1
add eax,
mov [ebp+i], eax
call sub_41110E //void asd()
mov eax, [ebp+i] //这三行是i+=1
add eax,
mov [ebp+i], eax
总结:一毛一样。
0x03
换一种语句,用for试试
编译器:Dev-C++ 5.11
代码:
void asd() {}
int main() {
int i;
for(i=; i<; i++) ;
asd();
for(i=; i<; i++) ;
asd();
for(i=; i<; i++) ;
asd();
return ;
}
反汇编: 总而言之还是那个样子。
0x04
换编译器:Microsoft Visual Studio 2013
代码:和上边一样
反汇编: 总而言之还是老样子。
0x05
还是不太放心
试试,如果是两个变量呢?
编译器:Dev-C++ 5.11
代码:
void asd() {}
int main() {
int i, j;
asd();
i=i+j;
asd();
i+=j;
asd();
return ;
}
反汇编:
call _Z3asdv ; asd(void)
mov eax, [rbp+var_8]
add [rbp+var_4], eax
call _Z3asdv ; asd(void)
mov eax, [rbp+var_8]
add [rbp+var_4], eax
call _Z3asdv ; asd(void)
一样。
0x06
总结:i++、i=i+1、i+=1, 效果一样。
i+=j、i=i+j,也是一样的
但是既然能够少写两个字符,为什么还要多写两个呢?
况且,用 i += j 的,总是看不起写 i = i + j 的。
最新文章
- Python中对字节流/二进制流的操作:struct
- 2013最常用的NoSQL数据库
- 同 一个页面,不同请求路径,如何根据实际场景写JS
- linux中,常用的账号管理命令
- .htaccess的301重定向代码
- 机器学习笔记之人工神经网络(ANN)
- code:blocks 编译环境设置
- coco2d-html5制作弹弓射鸟第一部分---橡皮筋
- MVC再次学习1
- <;%=id%>;是什么意思
- 【Yom框架】漫谈个人框架的设计之一:是IRepository还是IRepository<;T>;?
- linux 脚本保留日志
- 【学而思】利用shouldComponentUpdate钩子函数优化react性能以及引入immutable库的必要性
- css清除浮动方法小结
- Vi 操作命令
- python-web微信实现
- eclipse经常出现——未响应!!!
- 再谈一次关于Java中的 AIO(异步IO) 与 NIO(非阻塞IO)
- 怎样将M4A音频格式转换成MP3格式
- 【linux】linux命令grep + awk 详解
热门文章
- virtualbox+vagrant学习-4-Vagrantfile-5-Machine Settings
- selenium + python自动化测试unittest框架学习(六)分页
- 多线程之synchronized
- oracle 判断字段相等,但类型不同引起的性能问题
- Linux服务-ftp
- 网格布局(GridLayout) 行数与列数
- vue指令:v-model绑定表单控件;v-model与v-bind结合使用
- [笔记] Delphi 10.2.1 Tokyo 安装使用笔记
- 树莓派 ubuntu 系统下修改config.txt文件调整分辨率记录
- VB6 加载水晶报表例子