2014-07-16 69 views
-1

假設存儲器爲操作被完美地對齊並T是一個基本型(intfloatdouble,ECT),這些操作的將是對在最大優化級別大多數編譯器更有效率? :分配鑄造指針或memcpy的

void *memory = ::operator new(sizeof(T)); 
*reinterpret_cast<T*>(memory) = some_func(); 

void *memory = ::operator new(sizeof(T)); 
T i = some_func(); 
std::memcpy(memory, &i, sizeof(T)); 

本能告訴我們,第一個會更快(不含臨時值存儲),但我敢肯定,一個現代化的編譯器將優化了這一點。我覺得好像第一個操作邏輯上更有意義(爲一個位置賦值),但不適用於需要複製多個值的較大數據集,但我只是想知道簡單的操作,比如我的例子。

編輯:
由於我自己的情況下,我絕不會故意做這樣的事情,但我有一個第三方的API,它提供了一個malloc編輯緩衝區和所有我想要做的是修改前四個工作字節,以便在那裏放置一個整數值

+4

第一個是扁平UB。記憶中沒有任何物體,你不能奇蹟般地假裝有一個。 –

+3

唯一的「理智的」構造(並且擴展它)是':: new(memory)T(some_func());',但是爲什麼? –

+0

@KerrekSB不,它不是。在'new'返回的地址中分配了內存,並且可以根據需要處理內存(只要分配了足夠的空間)。 – CoffeeandCode

回答

-1

賦值是一種語言結構,它對編譯器是可見的,並且可以與some_func()中的對象結構組合進行優化。 memcpy()是一個具有原始內存操作的「隔離」函數。

第一個例子將高度依賴於some_func()內部。現代C++ 11/14構造包括可以幫助優化器很多的複製和移動操作。

+0

第一個**和第二個例子都高度依賴於'some_func( )的內部結構,因爲它可能花費5秒鐘的時間做一些事情,其中​​實際的複製需要幾納秒(簡單的類型) – CoffeeandCode

+0

memcpy()是一個函數,它是C++的一部分,編譯器知道它,因此也可以執行優化用它。 –

0

當沒有把每個例子放在一個循環中時,循環運行100萬次,看哪一個更快。確保你在編譯時儘管;)

+0

我不知道你爲什麼得到這個票的迴應,這肯定是最理智的答案。測試絕對是檢查的方法!程序集輸出對於兩者來說都是相同的,所以除了運行時差異之外,它們應該以相同的速度運行。 – CoffeeandCode