![](/img/trans.png)
[英]Is it possible to guarantee code doing memory writes is not optimized away in C++?
[英]C++ Is there any guarantee that literals conditions generated by a template will be optimized away?
請原諒我的代碼中的任何錯誤,我仍在學習 C++ 語法。 我的問題不是代碼是否正確,而是文字表達式是否會被優化掉。
假設我有一個從非類型模板生成的 function,如下所示:
template <bool add>
int addIt(int a, int b) {
if (add) {
return a + b;
} else {
return a - b;
}
}
int v = addIt<true>(10, 5);
據我了解,編譯器應該將模板擴展為:
int addIt_someID(int a, int b) {
if (true) {
return a + b;
} else {
return a - b;
}
}
int v = addIt_someID(10, 5);
但是因為它現在說if (true)
它應該能夠刪除整個分支,導致:
void addIt_someID(int a, int b) {
return a + b;
}
int v = addIt_someID(10, 5);
這應該是標准的編譯器行為......但是這種行為是否足夠確定,我可以從所有主要編譯器中確定它?
我依賴於編譯器的這種行為,如果不能保證我將不得不自己實現它......如果可以保證我可以讓 C++ 編譯器來做這將節省我很多時間自己解析和評估這個。
對於常規的if
,這永遠無法保證(盡管我會說機會非常高)。 有兩種方法可以確定。 更簡單的一個需要addIt
(順便說一句,似乎返回錯誤的類型):
template <bool add>
int addIt(int a, int b) {
if constexpr (add) {
return a + b;
} else {
return a - b;
}
}
int v = addIt<true>(10, 5);
if constexpr
保證這將在編譯時進行評估。
另一種選擇是使用模板元編程/顯式模板專業化。 對於您的代碼,這將非常簡單:
template <bool add>
int addIt(int a, int b);
template<> int addIt<true>(int a, int b) { return a + b; }
template<> int addIt<false>(int a, int b) { return a - b; }
int v = addIt<true>(10, 5);
對於其他情況,您需要更多的工作,例如使用std::enable_if
和類似的東西
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.