我發現自己調整了一段代碼,其中使用memcpy
複製了內存,第三個參數(大小)在編譯時已知。memcpy在編譯時已知大小
函數調用memcpy
的消費者做一些與此類似:現在
template <size_t S>
void foo() {
void* dstMemory = whateverA
void* srcMemory = whateverB
memcpy(dstMemory, srcMemory, S)
}
,我本來期望的是,memcpy
內在很聰明,認識到這一點:
foo<4>()
。 ..可以用函數中的memcpy
替換32位整數賦值。然而,令人驚訝的我發現自己看到了> 2倍加速這樣做:
template<size_t size>
inline void memcpy_fixed(void* dst, const void* src) {
memcpy(dst, src, size);
}
template<>
inline void memcpy_fixed<4>(void* dst, const void* src) { *((uint32_t*)dst) = *((uint32_t*)src); }
,改寫foo
到:
template <size_t S>
void foo() {
void* dstMemory = whateverA
void* srcMemory = whateverB
memcpy_fixed<S>(dstMemory, srcMemory)
}
兩種測試都在鐺(OS X)與-O3。我真的希望memcpy
固有的更聰明的情況下,在編譯時已知的大小。
我的編譯器標誌是:
-gline-tables-only -O3 -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
我要求太多了C++編譯器的或者是有我錯過了一些編譯器標誌?
的問題是,的memcpy實際上是一個C函數,不知道有關模板什麼... –
的memcpy是一個函數,所以的3個輸入不具有在編譯時是已知的。由於假定對齊訪問並且沒有函數調用開銷,所以使用整數賦值具有性能優勢。然而,假設對齊的訪問可能導致UB,如果這種假設不成立的話。 – user3528438
memcpy是一個內在的。現代C編譯器當然不只是一個正常的功能。嘗試添加對齊信息(可能是對齊提示)。 – usr