2015-02-10 69 views
-2

我有一個C函數轉換字節任意數量:適應的std ::交換接口交換n個字節

void my_swap(void* a, void* b, long n); 

我已經做了一些benckmark幾種類型,我已經看到了std::swap跑贏my_swap

所以,我想換std::swapmy_swap接口,但我無法弄清楚如何告訴std::swap表現得好像它是將一種類型T的兩個變量,爲此sizeof(T)==n

任何人都可以將std::swap包裝在一個具有相同簽名(當然與語義相同)的函數中,如my_swap

+0

當你有'std :: swap'這是類型安全的,爲什麼使用'my_swap'丟掉類型信息? – 2015-02-10 09:32:40

+0

@NickyC因爲我有很多舊代碼,我無法打破。 – 2015-02-10 09:36:33

+0

如果你在編譯時不知道'n'的值,那麼你不能這樣做。但是,如果您重新解釋將'a'和'b'強制轉換爲'char *',則可以使用'std :: swap_ranges'。 – 2015-02-10 09:43:52

回答

4

不可能,因爲std :: swap必須確切地知道傳入變量的類型。

可能有幾個原因,爲什麼你的my_swapstd::swap慢,如:

  • 你的功能轉移逐字節,這通常會導致爲4 *(或更多)不是做慢在整數上完成相同的操作
  • 編譯器生成較慢的代碼,因爲它不能確定這兩個void*變量指向「非混淆」內存(特別是,您要對指向內存執行的操作不會到達可能與另一個重疊的區域)。編譯器不允許爲這種情況生成快速代碼,因爲在重疊的情況下會導致錯誤的數據操作。

這就是爲什麼它是不可能寫出的my_swap的實現,將是快std::swap因爲這void*作爲參數的原因。