Sie*_*ter 5 c++ compiler-optimization c++11
假设我有一个类似这样的类:
class View
{
public:
View(DataContainer &c)
: _c(c)
{
}
inline Elem getElemForCoords(double x, double y)
{
int idx = /* some computation here... */;
return _c.data[idx];
}
private:
DataContainer& _c;
};
Run Code Online (Sandbox Code Playgroud)
如果我有一个使用这个类的函数,编译器是否允许完全优化它并只是内联数据访问?
如果View :: _ c碰巧是std :: shared_ptr,那么同样如此吗?
如果我有一个使用这个类的函数,编译器是否允许完全优化它并只是内联数据访问?
如果View :: _ c碰巧是std :: shared_ptr,那么同样如此吗?
绝对的,是的,是的 ; 只要它不违反as-if规则(正如Pentadecagon已经指出的那样).这种优化是否真的发生是一个更有趣的问题; 它是标准允许的.对于此代码:
#include <memory>
#include <vector>
template <class DataContainer>
class View {
public:
View(DataContainer& c) : c(c) { }
int getElemForCoords(double x, double y) {
int idx = x*y; // some dumb computation
return c->at(idx);
}
private:
DataContainer& c;
};
template <class DataContainer>
View<DataContainer> make_view(DataContainer& c) {
return View<DataContainer>(c);
}
int main(int argc, char* argv[]) {
auto ptr2vec = std::make_shared<std::vector<int>>(2);
auto view = make_view(ptr2vec);
return view.getElemForCoords(1, argc);
}
Run Code Online (Sandbox Code Playgroud)
我已经验证,通过检查汇编代码(g++ -std=c++11 -O3 -S -fwhole-program optaway.cpp),即在View类就像它不存在,它增加了零开销.
一些未经请求的建议.
检查程序的汇编代码; 你将学到很多,并开始担心正确的事情.shared_ptr是一个重量级的物体(例如unique_ptr,与之相比),部分原因在于引擎盖下的所有多线程机械.如果查看汇编代码,您将更加担心共享指针的开销,而不是元素访问.;)
在inline你的代码只是噪音,该功能是隐式内联无论如何.请不要使用inline关键字将代码丢弃; 无论如何,优化器可以自由地将其视为空格.使用链接时间优化(-flto使用gcc).GCC和Clang是令人惊讶的智能编译器并生成良好的代码.
描述您的代码,而不是猜测和过早优化.Perf是一个很棒的工具.
想要速度?测量.(作者Howard Hinnant)