is memset() more efficient than for loop in C?

前端 未结 7 1409
不思量自难忘°
不思量自难忘° 2021-02-02 06:46

is memset more efficient than for loop. so if i have

char x[500];
memset(x,0,sizeof(x));

or

char x[500];
for(int i = 0 ; i &         


        
7条回答
  •  难免孤独
    2021-02-02 07:02

    Well, why don't we take a look at the generated assembly code, full optimization under VS 2010.

    char x[500];
    char y[500];
    int i;      
    
    memset(x, 0, sizeof(x) );   
      003A1014  push        1F4h  
      003A1019  lea         eax,[ebp-1F8h]  
      003A101F  push        0  
      003A1021  push        eax  
      003A1022  call        memset (3A1844h)  
    

    And your loop...

    char x[500];
    char y[500];
    int i;    
    
    for( i = 0; i < 500; ++i )
    {
        x[i] = 0;
    
          00E81014  push        1F4h  
          00E81019  lea         eax,[ebp-1F8h]  
          00E8101F  push        0  
          00E81021  push        eax  
          00E81022  call        memset (0E81844h)  
    
          /* note that this is *replacing* the loop, 
             not being called once for each iteration. */
    }
    

    So, under this compiler, the generated code is exactly the same. memset is fast, and the compiler is smart enough to know that you are doing the same thing as calling memset once anyway, so it does it for you.

    If the compiler actually left the loop as-is then it would likely be slower as you can set more than one byte size block at a time (i.e., you could unroll your loop a bit at a minimum. You can assume that memset will be at least as fast as a naive implementation such as the loop. Try it under a debug build and you will notice that the loop is not replaced.

    That said, it depends on what the compiler does for you. Looking at the disassembly is always a good way to know exactly what is going on.

提交回复
热议问题