C/C++代码被 VS 2010 优化掉了,如何关闭优化?
2015-07-14 13:11
791 查看
作为一个疯狂的汇编C/C++爱好者,写完代码看看被编译成什么自然很好奇,
打开反汇编调试,Debug给的东西很乱:
比如断点指令一个劲填充栈区防止程序跑飞了。
这样总是给人一种分心的感觉
所以打开看看Release 版本看看也是很自然的原因。
因为main函数内部的操作对外界没有影响,所以被浓缩为下面两句话也是可以理解的:
但是问题却来了,怎么看编译结果呢?(在工程名后点属性,跟着蓝线紫线走)
点确定继续
再次编译,是不是比Debug版本干净多了呢?
打开反汇编调试,Debug给的东西很乱:
比如断点指令一个劲填充栈区防止程序跑飞了。
int main(void) { 00351350 push ebp 00351351 mov ebp,esp 00351353 sub esp,160h 00351359 push ebx 0035135A push esi 0035135B push edi 0035135C lea edi,[ebp-160h] 00351362 mov ecx,58h 00351367 mov eax,0CCCCCCCCh 0035136C rep stos dword ptr es:[edi]还比如程序运行完成后要清理环境:
return 0; 00351488 xor eax,eax } 0035148A pop edi 0035148B pop esi 0035148C pop ebx 0035148D mov esp,ebp 0035148F pop ebp 00351490 ret --- No source file --------------------- 00351491 int 3
这样总是给人一种分心的感觉
所以打开看看Release 版本看看也是很自然的原因。
因为main函数内部的操作对外界没有影响,所以被浓缩为下面两句话也是可以理解的:
01381000 xor eax,eax } 01381002 ret
但是问题却来了,怎么看编译结果呢?(在工程名后点属性,跟着蓝线紫线走)
点确定继续
再次编译,是不是比Debug版本干净多了呢?
--- d:\cpp_loves_asm\2_arithmetic\2_arithmetic.cpp ----------------------------- /////////////////////////////////////////////////////////////// // 2_arithmetic.cpp // // This is a deliberate to demonstrate how // C++ and ASM as well as C are connected. // // Mighten Dai // 22:32 // Jul 13, 2015 // /////////////////////////////////////////////////////////////// // ---Part 2: Arithmetic operations #include <iostream> using namespace std; int main(void) { 00FA1000 push ebp 00FA1001 mov ebp,esp 00FA1003 sub esp,38h // the unsigned integer unsigned int ui_arg_1; unsigned int ui_arg_2; unsigned int ui_result = 0; 00FA1006 mov dword ptr [ui_result],0 // the signed integer signed int si_arg_1; signed int si_arg_2; signed int si_result = 0; 00FA100D mov dword ptr [si_result],0 // the floating point number float f_arg_1; float f_arg_2; float f_result = 0; 00FA1014 fldz 00FA1016 fstp dword ptr [f_result] // the others types long int li_test = 0; 00FA1019 mov dword ptr [li_test],0 long long int lli_test = 0; 00FA1020 mov dword ptr [lli_test],0 00FA1027 mov dword ptr [ebp-1Ch],0 bool b_test = 0; 00FA102E mov byte ptr [b_test],0 char c_test = 0; 00FA1032 mov byte ptr [c_test],0 /////////////////////////////////////////////////// // the unsigned integer operations ui_arg_1 = 10; 00FA1036 mov dword ptr [ui_arg_1],0Ah ui_arg_2 = 5; 00FA103D mov dword ptr [ui_arg_2],5 ui_result = ui_arg_1 + ui_arg_2; 00FA1044 mov eax,dword ptr [ui_arg_1] 00FA1047 add eax,dword ptr [ui_arg_2] 00FA104A mov dword ptr [ui_result],eax ui_result = ui_arg_1 - ui_arg_2; 00FA104D mov ecx,dword ptr [ui_arg_1] 00FA1050 sub ecx,dword ptr [ui_arg_2] 00FA1053 mov dword ptr [ui_result],ecx ui_result = ui_arg_1 * ui_arg_2; 00FA1056 mov edx,dword ptr [ui_arg_1] 00FA1059 imul edx,dword ptr [ui_arg_2] 00FA105D mov dword ptr [ui_result],edx ui_result = ui_arg_1 / ui_arg_2; 00FA1060 mov eax,dword ptr [ui_arg_1] 00FA1063 xor edx,edx 00FA1065 div eax,dword ptr [ui_arg_2] 00FA1068 mov dword ptr [ui_result],eax ui_result = ui_arg_1 % ui_arg_2; 00FA106B mov eax,dword ptr [ui_arg_1] 00FA106E xor edx,edx 00FA1070 div eax,dword ptr [ui_arg_2] 00FA1073 mov dword ptr [ui_result],edx /////////////////////////////////////////////////// // the signed integer operations si_arg_1 = -10; 00FA1076 mov dword ptr [si_arg_1],0FFFFFFF6h si_arg_2 = -5; 00FA107D mov dword ptr [si_arg_2],0FFFFFFFBh si_result = si_arg_1 + si_arg_2; 00FA1084 mov eax,dword ptr [si_arg_1] 00FA1087 add eax,dword ptr [si_arg_2] 00FA108A mov dword ptr [si_result],eax si_result = si_arg_1 - si_arg_2; 00FA108D mov ecx,dword ptr [si_arg_1] 00FA1090 sub ecx,dword ptr [si_arg_2] 00FA1093 mov dword ptr [si_result],ecx si_result = si_arg_1 * si_arg_2; 00FA1096 mov edx,dword ptr [si_arg_1] 00FA1099 imul edx,dword ptr [si_arg_2] 00FA109D mov dword ptr [si_result],edx si_result = si_arg_1 / si_arg_2; 00FA10A0 mov eax,dword ptr [si_arg_1] 00FA10A3 cdq 00FA10A4 idiv eax,dword ptr [si_arg_2] 00FA10A7 mov dword ptr [si_result],eax si_result = si_arg_1 % si_arg_2; 00FA10AA mov eax,dword ptr [si_arg_1] 00FA10AD cdq 00FA10AE idiv eax,dword ptr [si_arg_2] 00FA10B1 mov dword ptr [si_result],edx // the floating point number operations f_arg_1 = 2.43E+7; // 2.43 times 10 to plus 7 00FA10B4 fld dword ptr [__real@4bb964f0 (0FA20E8h)] 00FA10BA fstp dword ptr [f_arg_1] f_arg_2 = 1.62E-5; // 1.62 times 10 to minus 5 00FA10BD fld dword ptr [__real@3787e53c (0FA20E4h)] 00FA10C3 fstp dword ptr [f_arg_2] f_result = f_arg_1 + f_arg_2; 00FA10C6 fld dword ptr [f_arg_1] 00FA10C9 fadd dword ptr [f_arg_2] 00FA10CC fstp dword ptr [f_result] f_result = f_arg_1 - f_arg_2; 00FA10CF fld dword ptr [f_arg_1] 00FA10D2 fsub dword ptr [f_arg_2] 00FA10D5 fstp dword ptr [f_result] f_result = f_arg_1 * f_arg_2; 00FA10D8 fld dword ptr [f_arg_1] 00FA10DB fmul dword ptr [f_arg_2] 00FA10DE fstp dword ptr [f_result] f_result = f_arg_1 / f_arg_2; 00FA10E1 fld dword ptr [f_arg_1] 00FA10E4 fdiv dword ptr [f_arg_2] 00FA10E7 fstp dword ptr [f_result] // the others types operations li_test = 3000000000; 00FA10EA mov dword ptr [li_test],0B2D05E00h lli_test = 30000000000000; 00FA10F1 mov dword ptr [lli_test],0EB57E000h 00FA10F8 mov dword ptr [ebp-1Ch],1B48h b_test = 0; 00FA10FF mov byte ptr [b_test],0 b_test = 1; 00FA1103 mov byte ptr [b_test],1 c_test = 'A'; 00FA1107 mov byte ptr [c_test],41h return 0; 00FA110B xor eax,eax } 00FA110D mov esp,ebp 00FA110F pop ebp 00FA1110 ret
相关文章推荐
- 【C语言的概念】
- Invert Binary Tree
- Basic Calculator II
- 【Kth Smallest Element in a BST 】cpp
- Basic Calculator
- 【Invert Binary Tree】cpp
- HDU-1052-Tian Ji -- The Horse Racing(C++ && 简单贪心)
- 【Lowest Common Ancestor of a Binary Search Tree】cpp
- xcode项目编译C/C++文件could not build module foundation
- C++多线程编程时的数据保护
- 《Effective C++》——条款08:别让异常逃离析构函数
- C++程序中启动线程的方法
- 在Visual Studio使用C++开发Metro应用
- 运行C++11代码
- C++ 返回值为引用
- C++用opengl直接调用box2D 的debug绘图
- C++ 返回值为引用
- PHP调用C++扩展时memset/sizeof函数无效的问题
- 探究在C++程序并发时保护共享数据的问题
- C++中关于委派(Delegates)的实现示例