从汇编层面看多个赋值语句写在一行, 用','符号分开
2015-12-18 11:56
344 查看
在看算法例题时, 发现在一个宏中出现了previous[i] = i-1, next[i] = i+1; 这样的写法
我就想知道他为啥这么写, 为啥不写成如下语句.
previous[i] = i-1;
next[i] = i+1;
难道有什么特别的好处么?
看调试版的反汇编实现
next[]数组内存地址 : [ebp-58h]
可以看出, 两种写法, 生成的汇编代码一样.
那为什么要这么写呢?
2个赋值语句写在一行的代码在一个宏里
这么做的本意就只有一个原因了, 就是为了在for循环语句下少写一对 {}.
所以像这样的技巧还是少在工程中用.
不是每个维护者和学习者都能理解语法层面的奇技淫巧.
我鄙视语法层面的奇技淫巧^_^
我就想知道他为啥这么写, 为啥不写成如下语句.
previous[i] = i-1;
next[i] = i+1;
难道有什么特别的好处么?
看调试版的反汇编实现
数组内存地址
previous[]数组内存地址 : dword ptr [ebp-2Ch]next[]数组内存地址 : [ebp-58h]
在一行中用','符号分隔, 进行多个语句的赋值的反汇编分析
50: previous[i] = i-1, next[i] = i+1; 004010DC 8B 95 24 FF FF FF mov edx,dword ptr [i] 004010E2 83 EA 01 sub edx,1 ; ///< edx = i - 1; 004010E5 8B 85 24 FF FF FF mov eax,dword ptr [i] <span style="font-family: Arial, Helvetica, sans-serif;">; ///< (i - 1)放到edx</span> 004010EB 89 54 85 D4 mov dword ptr [ebp+eax*4-2Ch],edx ; ///< <span style="font-family: Arial, Helvetica, sans-serif;">previous[i] = i-1</span> 004010EF 8B 8D 24 FF FF FF mov ecx,dword ptr [i] 004010F5 83 C1 01 add ecx,1 ; ///< ecx = i + 1 004010F8 8B 95 24 FF FF FF mov edx,dword ptr [i] 004010FE 89 4C 95 A8 mov dword ptr [ebp+edx*4-58h],ecx ; ///< next[i] = i + 1;
用2行单独赋值语句的反汇编分析
51: previous[i] = i-1; 004010DC 8B 95 24 FF FF FF mov edx,dword ptr [i] 004010E2 83 EA 01 sub edx,1 004010E5 8B 85 24 FF FF FF mov eax,dword ptr [i] 004010EB 89 54 85 D4 mov dword ptr [ebp+eax*4-2Ch],edx 52: next[i] = i+1; 004010EF 8B 8D 24 FF FF FF mov ecx,dword ptr [i] 004010F5 83 C1 01 add ecx,1 004010F8 8B 95 24 FF FF FF mov edx,dword ptr [i] 004010FE 89 4C 95 A8 mov dword ptr [ebp+edx*4-58h],ecx
可以看出, 两种写法, 生成的汇编代码一样.
那为什么要这么写呢?
2个赋值语句写在一行的代码在一个宏里
// #define INITIAL(n) { unsigned long i; \ // for (i = 2; i <= n; i++) \ // previous[i] = i-1, next[i] = i+1;\ // previous[2] = next = 0; \ // }
这么做的本意就只有一个原因了, 就是为了在for循环语句下少写一对 {}.
总结
代码是给人看的, 如果编码代码生成结果一样的情况下. 必须写的可维护性高才行.所以像这样的技巧还是少在工程中用.
不是每个维护者和学习者都能理解语法层面的奇技淫巧.
我鄙视语法层面的奇技淫巧^_^
相关文章推荐
- java前后端开发中乱码问题
- VS2010+PCL+openni配置
- 黑马程序员 - OC语言 - 单个对象内存管理(野指针)
- msg解决shareSDK分享失败问题
- 详解Linux系统中字符串搜索命令ngrep的用法
- JS检查上传图片的类型和大小
- Quartz中时间表达式的设置-----corn表达式
- 使用Android Studio时你应该知道的
- 伪装IP进行投票
- SDWebImage的使用以及内部执行流程
- Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. 试图加载格式不正确的程序。
- linux c/c++监听鼠标或键盘事件
- 编程技巧的零散学习
- iOS二维码生成及扫码
- Matlab实现Hough变换检測图像中的直线
- 门面(Facade)模式--医院,保安系统实例
- 用 JMH 检测 Lambdas 序列化性能
- xss跨站攻击解决方法
- JDBC利用游标分页查询
- openerp 不能发送email,请配置发件人的email地址或者别名