2013-12-08 107 views
3

我在面試中遇到了這個問題,它似乎很簡單,但我想確認我對其功能的理解。將元素從一個內存複製到另一個內存

f (char *p, char *q, int n) 
{ 
    int i1 = n >> 2; 
    int i2 = n & 3; 

    switch (i2) 
    { 
     do { 
      *q++ = *p++; 
      case 3: *q++ = *p++; 
      case 2: *q++ = *p++; 
      case 1: *q++ = *p++; 
      case 0: ; 
     } while (i1--); 
    } 
} 

有人問我以下的問題在採訪時說:

  1. 這是什麼功能呢?
  2. 爲什麼有人會寫這樣複雜的代碼?
  3. 有什麼方法可以用不同的方式寫(更簡單,更快)嗎?給定

數目:

  1. 該函數將來自所述存儲器,其中* P所指向的存儲器,其中* q被指向的元素的數量。

  2. ,如果你將它與下面環路(只寫循環)寫

    for(i=0;i<n;i++) 
        *q++ = *p++; 
    

    那麼編譯器採取更多的MIPS /時間條件檢查。在這裏它會首先從n中減去i,然後檢查是否爲非零?在給定的代碼while循環保持條件只有1條件,如果i1是非零?所以在while循環中檢查的條件較少。

  3. 我們可以爲寫:

    f (char *p, char *q, int n) 
    { 
        for(i=n;i--;) 
        *q++ = *p++; 
    } 
    

    看似簡單,更快的給我。

請給我你的意見。

+3

一個好的建議 - 在你發佈代碼之前,把它寫在你的計算機上的文本編輯器中,然後將它複製到你的問題中。這樣你可以注意到一些typeos,並正確地得到縮進。 – elyashiv

+0

它看起來像有人錯誤地編輯你的代碼? 它應該是{switch(){..};} while(); – dragon135

回答

1

首先在你的答案中,你似乎沒有考慮到n >> 2整數除以4循環前n。 然後,您不檢查第二個條件,即如果n%4 == 0,則不復制該值。

  • 複製7個字節並忽略從p到q的n/4個字節的第8個字節;
  • 這樣做非常有效。使用& 3而不是%4最有可能快得多,並且使用>> 2而不是/ 4可能會更快;只有可能是因爲編譯器或c語言可能會自動爲您進行優化;
  • 我想給這樣的事情

    f (char *p, char *q, int n) 
    { 
    int i1 = n >> 2; //i1 = n/3; 
    int i2 = n & 3; //i2 = n & 0b111 = n % 4; 
    
    for(; i1 + 1 ; --i) { 
        *q++ = *p++; 
        if (i2) *q++ = *p++;    
        } 
    } 
    
  • mentionning for循環更容易理解,只是作爲 高效,

  • 和改變開關語句單,如果 聲明更清潔並且最有可能具有類似的性能。

  • 然後,我會得出結論,我注意到,爲了使它們的功能更清晰,我添加了對按位運算的操作 的評論。

相關問題