C++ 为什么编译器左移0?
在我编写了这个简单的程序之后,当我在VisualStudio中进入反汇编模式时,我注意到了一件奇怪的事情:编译器添加了一条向左移位0位的指令 为什么会这样C++ 为什么编译器左移0?,c++,assembly,visual-c++,C++,Assembly,Visual C++,在我编写了这个简单的程序之后,当我在VisualStudio中进入反汇编模式时,我注意到了一件奇怪的事情:编译器添加了一条向左移位0位的指令 为什么会这样 这是C++代码: #include <iostream> using namespace std; int main(int argc, char **argv) { if (argc != 3) return 0; if (strcmp(argv[1], "-r") == 0) {
这是C++代码:
#include <iostream>
using namespace std;
int main(int argc, char **argv) {
if (argc != 3)
return 0;
if (strcmp(argv[1], "-r") == 0) {
printf("test");
}
return 0;
}
#包括
使用名称空间std;
int main(int argc,字符**argv){
如果(argc!=3)
返回0;
if(strcmp(argv[1],“-r”)==0){
printf(“测试”);
}
返回0;
}
这是汇编代码:
...
return 0;
00131C94 xor eax,eax
00131C96 jmp main+57h (0131CC7h)
if (strcmp(argv[1], "-r") == 0) {
00131C98 push offset string "-r" (0138B30h)
00131C9D mov eax,4
00131CA2 shl eax,0 <------------------------- HERE
00131CA5 mov ecx,dword ptr [argv]
00131CA8 mov edx,dword ptr [ecx+eax]
00131CAB push edx
00131CAC call _strcmp (01313D9h)
00131CB1 add esp,8
00131CB4 test eax,eax
00131CB6 jne main+55h (0131CC5h)
printf("test");
00131CB8 push offset string "test" (0138BD0h)
00131CBD call _printf (01313E8h)
00131CC2 add esp,4
...
。。。
返回0;
00131C94异或eax,eax
00131C96 jmp干管+57小时(0131C7H)
if(strcmp(argv[1],“-r”)==0){
00131C98推力偏置串“-r”(0138B30h)
00131C9D mov eax,4
00131CA2 shl eax,0注意,这用于评估argv[1]
一般来说,argv[N]
需要由编译器翻译成*((char**)((char*)argv+N*sizeof*argv))
:每个指针在下一个之后是sizeof*argv
字节。当编译时不知道N
时,乘法需要在那里,而shl
是执行此操作的正常方法*
由于N
在编译时是已知的,但您还没有启用优化,我猜这将编译为
00131C9D mov eax,1
00131CA2 shl eax,2
显然,即使禁用了优化,VisualStudio也可以将其简化为您看到的内容,但如果没有优化,它仍然无法完全摆脱shl
*在这种特定情况下,即使编译时不知道N
,也不需要shl
:
可以用一条指令访问。这将是另一个通常会执行的优化。您启用了优化吗?它似乎只增加了x86的移位,而不是x64。在发布版本中似乎也消失了。我认为MSVC在前端执行强度降低,这是有意义的,因为它基于pcc(哪个IIRC也这样做)。