爲什麼沒有C標準一memswap功能,這可能會是這樣的:爲什麼沒有一個標準的memswap功能
int memswap(void *ptr1, void *ptr2, size_t nbytes)?
我知道這會很容易寫,但我認爲libc可以做一些很棒的技巧來加速它,就像一些實現爲memcpy做的那樣。
爲什麼沒有C標準一memswap功能,這可能會是這樣的:爲什麼沒有一個標準的memswap功能
int memswap(void *ptr1, void *ptr2, size_t nbytes)?
我知道這會很容易寫,但我認爲libc可以做一些很棒的技巧來加速它,就像一些實現爲memcpy做的那樣。
這不是常規需要的東西。
這些想法可能已經被考慮和丟棄,因爲想出一個通用的算法是相當困難的。不要忘記C是一種古老的語言,擴展需要普遍有用。
可能的錯誤條件: - 當被交換的範圍重疊運行內存
該最好算法米也可能取決於你在做什麼,所以可能更好地直接由你編碼。
可能是因爲它經常不需要 - 我經常合併memset和memcpy,但我不知道如果可用的話我會使用memswap。
我想是因爲它不經常需要。然而,在C到做一個簡單的方法++:
#include <algorithm>
swap_ranges(ptr1, ptr1 + nbytes, ptr2)
這也未必是相當優化的內置的編譯器,但它具有比你寫自己的循環速度的潛力,因爲它可能有特定於平臺的優化,你不會實現。
你需要小心以上,因爲它假定ptr1和ptr2是字符指針。更規範的方式來做到這一點是:
#include <algorithm>
swap_ranges(ptr1, ptr1 + num_items, ptr2)
它可能不需要經常在C語言編程,在C++中,其中交換是做對類成員經常的事情還有的std::swap算法是高度優化不同種類。
你看過拭子嗎?
男子棉籤
最好的算法不一定是你的。GCC有`memset`作爲關鍵字,並且基於它是memsetting,它可能離開函數調用,或者有一個for循環,或者有一個展開的for循環,等等。編譯器現在很聰明。 – Claudiu 2009-08-28 17:52:12
那麼,這些的自然結果是:重疊 - > UB,長度== 0 - >無操作,應該就地,可能使用固定數量的堆棧,空指針 - > UB。在那裏沒有任何意外的事。 – Deduplicator 2015-04-21 17:47:18