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--);
}
}
有人問我以下的問題在採訪時說:
- 這是什麼功能呢?
- 爲什麼有人會寫這樣複雜的代碼?
- 有什麼方法可以用不同的方式寫(更簡單,更快)嗎?給定
數目:
該函數將來自所述存儲器,其中* P所指向的存儲器,其中* q被指向的元素的數量。
,如果你將它與下面環路(只寫循環)寫
for(i=0;i<n;i++) *q++ = *p++;
那麼編譯器採取更多的MIPS /時間條件檢查。在這裏它會首先從n中減去i,然後檢查是否爲非零?在給定的代碼while循環保持條件只有1條件,如果i1是非零?所以在while循環中檢查的條件較少。
我們可以爲寫:
f (char *p, char *q, int n) { for(i=n;i--;) *q++ = *p++; }
看似簡單,更快的給我。
請給我你的意見。
一個好的建議 - 在你發佈代碼之前,把它寫在你的計算機上的文本編輯器中,然後將它複製到你的問題中。這樣你可以注意到一些typeos,並正確地得到縮進。 – elyashiv
它看起來像有人錯誤地編輯你的代碼? 它應該是{switch(){..};} while(); – dragon135