Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么编译器左移0?_C++_Assembly_Visual C++ - Fatal编程技术网

C++ 为什么编译器左移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) {

在我编写了这个简单的程序之后,当我在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) {
        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也这样做)。