FreeBSD's generic implementation of memchr
做:爲什麼FreeBSD的memchr實現在它的條件下增加它的指針?
void *
memchr(const void *s, int c, size_t n)
{
if (n != 0) {
const unsigned char *p = s;
do {
if (*p++ == (unsigned char)c)
return ((void *)(p - 1));
} while (--n != 0);
}
return (NULL);
}
這對我來說似乎是不必要的複雜;最初的n != 0
檢查與do
- while
只是爲了避免p
聲明似乎完全沒有意義。然而,我在爲什麼循環體確實特別感興趣:
if (*p++ == (unsigned char)c)
return ((void *)(p - 1));
,而不是更直截了當:
if (*p == (unsigned char)c)
return ((void *) p);
++p;
是否內聯後遞增與病情有一定優化的好處對於一些編譯器/平臺?
您是否檢查編譯器生成的機器碼(使用優化)?這與你的方法有什麼不同?'p'的_definition_是否生成代碼?是的,你會錯過考慮最可能編寫代碼的時間以及當時優化編譯器的優劣。相當多的CPU有「減量和分支如果不是零」指令。 – Olaf
@Olaf我確實使用godbolt來比較實現和gcc(使用-O3,再次使用-Os)。我不擅長彙編,但直截了當的版本似乎產生較少的指令。 – jamesdlin
重新閱讀我的評論,我增加了很多。你檢查每個運行BSD的目標? x86並不是一個廣泛傳播的平臺。該代碼甚至可以用於8位和16位MCU,其數量超過x86和ARM數十年。 – Olaf