如果我使用auto_ptr作爲填充大向量的函數的返回值,則會使該函數成爲源函數(它將創建內部auto_ptr並在返回非const auto_ptr)。但是,我不能在STL算法中使用這個函數,因爲爲了訪問數據,我需要對auto_ptr進行解引用。我猜想一個很好的例子是一個大小爲N的矢量場,每個矢量有100個分量。如果N很大,那麼函數返回的每個100分量矢量的值或ref都不相同。針對大型向量的返回值優化vs auto_ptr
此外,當我嘗試這個非常基本的代碼:
class t
{
public:
t() { std::cout << "ctor" << std::endl; }
~t() { std::cout << "dtor" << std::endl; }
};
t valueFun()
{
return t();
}
std::auto_ptr<t> autoFun()
{
return std::auto_ptr(new t());
}
兩個autoFun和樂趣調用導致與輸出
男星 析構函數
,所以我不能真正看到自動變量,正在被創建以轉移到返回聲明。這是否意味着爲ValueFun調用設置了返回值優化?在這種情況下,valueFun是否創建了兩個自動對象?
那麼如何優化具有函數的這種大型數據結構的總體?
您是否問RVO是否也適用於您的大型矢量?如果是這樣,你不能只用上面的例子來測試它嗎? – juanchopanza
當我測試它時,是否意味着它適用於所有編譯器/平臺?我應該如何知道RVO是否包含在內,我應該閱讀編譯器規範嗎?如果代碼在具有不同編譯器的HPC羣集上編譯並且庫很大,會發生什麼情況? – tmaric
是的,我明白你的觀點。這是允許編譯器的事情之一,但不是必需的,所以你永遠無法確定。順便說一句你有C++ 11支持嗎? – juanchopanza