我有gcc
版8.2.1
。
在以下代码中,我希望编译器不会在方法mfence
中的两个CheckAndPrint()
指令之间生成任何代码。
的确,如果我调用PrintGood<false>()
方法并且没有代码生成,它将很好地完成工作。但是,如果我不评论PrintBad<false>()
甚至是简单的return
,编译器都会为if
表达式if (t.j > 0)
生成代码。
在所有三种情况下,都没有理由生成任何代码,尤其是对于昂贵的分支。
下面的代码编译为:
g++ -std=c++11 -Ofast optimization_problem.cc -o optimization_problem
试图直接与gcc bugzilla联系,但在该处创建帐户时遇到问题。
编译器在一种情况下设法优化代码,而在另两种情况下却无法优化代码是否有充分的理由?
#include <iostream>
#include <string>
struct Data {
int i;
int j;
};
template <typename Dummy>
class Test {
public:
template <typename T>
void CheckAndPrint(const T &t);
protected:
template <bool print, typename T>
inline void PrintGood(const std::string &prefix, const T &t);
template <bool print, typename T>
inline void PrintBad(const std::string &prefix, const std::string &postfix, const T &t);
};
template <typename Dummy>
template <typename T>
inline void Test<Dummy>::CheckAndPrint(const T &t) {
asm volatile ("mfence" ::: "memory");
if (t.j > 0) {
//return;
//PrintBad<false>("<", ">", t);
PrintGood<false>("<", t);
}
asm volatile ("mfence" ::: "memory");
}
template <typename Dummy>
template <bool print, typename T>
inline void Test<Dummy>::PrintGood(const std::string &prefix, const T &t) {
if (print)
std::cout << prefix << t.i << t.j << std::endl;
}
template <typename Dummy>
template <bool print, typename T>
inline void Test<Dummy>::PrintBad(const std::string &prefix, const std::string &postfix, const T &t) {
if (print)
std::cout << prefix << t.i << t.j << postfix << std::endl;
}
int main() {
Data data;
std::cin >> data.i;
std::cin >> data.j;
Test<int> t;
t.CheckAndPrint(data);
return 0;
}