2008-09-20 41 views
14

爲什麼沒有C標準一memswap功能,這可能會是這樣的:爲什麼沒有一個標準的memswap功能

int memswap(void *ptr1, void *ptr2, size_t nbytes)? 

我知道這會很容易寫,但我認爲libc可以做一些很棒的技巧來加速它,就像一些實現爲memcpy做的那樣。

回答

6

這不是常規需要的東西。

這些想法可能已經被考慮和丟棄,因爲想出一個通用的算法是相當困難的。不要忘記C是一種古老的語言,擴展需要普遍有用。

可能的錯誤條件: - 當被交換的範圍重疊運行內存

  • 長度的零
  • (最佳實現可能分配內存以做到這一點)
    • 行爲指針

    最好算法米也可能取決於你在做什麼,所以可能更好地直接由你編碼。

    • 交換有可能使用一個臨時結構和分配
    • 小的長度,以更快的結構 - 通過部分交換(其中部分是一些最佳長度)「部分」 - 可以被更好地分配臨時存儲器
    • 長的長度
    • 使用硬件複製功能
  • +3

    最好的算法不一定是你的。GCC有`memset`作爲關鍵字,並且基於它是memsetting,它可能離開函數調用,或者有一個for循環,或者有一個展開的for循環,等等。編譯器現在很聰明。 – Claudiu 2009-08-28 17:52:12

    +0

    那麼,這些的自然結果是:重疊 - > UB,長度== 0 - >無操作,應該就地,可能使用固定數量的堆棧,空指針 - > UB。在那裏沒有任何意外的事。 – Deduplicator 2015-04-21 17:47:18

    2

    可能是因爲它經常不需要 - 我經常合併memset和memcpy,但我不知道如果可用的話我會使用memswap。

    10

    我想是因爲它不經常需要。然而,在C到做一個簡單的方法++:

    #include <algorithm> 
    
    swap_ranges(ptr1, ptr1 + nbytes, ptr2) 
    

    這也未必是相當優化的內置的編譯器,但它具有比你寫自己的循環速度的潛力,因爲它可能有特定於平臺的優化,你不會實現。

    你需要小心以上,因爲它假定ptr1和ptr2是字符指針。更規範的方式來做到這一點是:

    #include <algorithm> 
    
    swap_ranges(ptr1, ptr1 + num_items, ptr2) 
    
    2

    它可能不需要經常在C語言編程,在C++中,其中交換是做對類成員經常的事情還有的std::swap算法是高度優化不同種類。

    -2

    你看過拭子嗎?

    男子棉籤

    相關問題