可以修改我有一些像這樣的代碼,其中VEC某種載體類:避免構造一個新的對象,如果它是一個參數,而不是
Vec Vec::choose(const Vec& ifPositive, const Vec& ifNegative) const {
Vec out(mSize);
for(int index = 0; index < mSize; ++index) {
if(mData[i] > 0)
out[i] = ifPositive[i];
else
out[i] = ifNegative[i];
}
return out;
}
下面這段代碼工作正常在一般情況下,但如果函數的左手邊是一個參數,也有一些不必要的constuctor /析構函數調用:
curVal = trigger.choose(posVal, curVal); // construct is called in choose, then old curVal is destroyed
是有一些方法來提高/避免這種情況,如果編譯器看到喜歡當左函數的手邊是其中一個參數,它會運行不同的代碼?
編輯: 下面是一些示例代碼:http://ideone.com/nPUK3h
我想知道,如果它能夠ommit最後(4)建設。 我將在稍後在家中進行一些更復雜的優化來編譯。
EDIT2: 我能避免額外的結構,如果我介紹以下附加功能:
Vec& Vec::setNegative(Vec& target, const Vec& ifNegative) const {
for(int index = 0; index < mSize; ++index) {
if(mData[index] <= 0)
target[index] = ifNegative[index];
}
return target;
}
因此,如果選擇功能的LHS是相同的作爲第一個參數,這產生相同的輸出,然而,如果lhs是另一個向量,我希望得到一個新的向量。
有什麼方法可以通過一些模板魔法或編譯器技術在兩者之間進行選擇?
使用支持RVO的理智編譯器。 – PlasmaHH
它實際上是否構成多餘的副本?根據您的編譯器,優化級別和調用代碼的結構,您可能會發現它會忽略您擔心的部分或全部冗餘。 –
我沒有看到你在函數中的任何地方使用'ifNegative'。錯字? – jrok