我想「模擬」std::move()
函數,以評估其對我寫的C++庫的(正)性能影響。模擬std :: move()函數來評估其性能影響
我已經廣泛地使用了std::move()
,並且我想避免grep
ping處處刪除它。用身份函數替換它的最好方法是什麼?我正在編譯gcc
。
我想「模擬」std::move()
函數,以評估其對我寫的C++庫的(正)性能影響。模擬std :: move()函數來評估其性能影響
我已經廣泛地使用了std::move()
,並且我想避免grep
ping處處刪除它。用身份函數替換它的最好方法是什麼?我正在編譯gcc
。
我相當確定沒有辦法實現這個短的屠殺你自己的代碼來刪除你想要配置的大對象上的所有移動構造函數。你也可能會發現你將會遇到將非右值引用傳遞給期望右值引用的函數的問題。
所以我建議不要打擾並接受它很有可能你的代碼更快,並且滿意。
我其實想在一年前試試這個,而且從來沒有找到辦法。
我不想刪除移動構造函數:有時我不能,因爲它們在STL中。我想嘲笑我的'std :: move'調用,這實際上可能會阻止一些副本的發生。 – gd1
這應該「工作」,但實際上它是未定義的行爲:
// Standard library includes must be above.
#define move not_a_move
namespace std {
template<typename T>
typename std::remove_lvalue_reference<T>::type const&
not_a_move(T&& x)
{
return x;
}
}
這不會捕捉隱含的移動或標準庫內部完成移動。我會建議刪除您的所有使用std::move
;它更乾淨,實際上也是允許的。 :P
刪除所有顯式的'std :: move'調用不會阻止所有隱式調用移動構造函數。 – goji
@Troy:我知道...... – gd1
你知道'move'和'forward'實際上並沒有移動或轉發嗎?他們做一個編譯器no-op將輸入重新解釋爲一個r值引用(有時候稱爲「forward」)。任何實際移動都發生在移動建築或分配過程中。嘗試通過這些點進行配置。 – CTMacUser