Pau*_*cas 14 c++ optimization templates argument-passing
我想写一个模板函数,它与a std::stack<T>和一个实例做一些事情T,例如:
template<class StackType> inline
bool some_func( StackType const &s, typename StackType::value_type const &v ) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
我通过v引用传递的原因当然是针对StackType::value_typea struct或者class不按值复制整个对象的情况进行优化.
但是,如果它StackType::value_type是一个"简单"类型int,那么它当然更简单地通过值传递它.
的问题是:对于一个类型,如int,将成为int const&作为一个正式的参数在上面的功能,将编译器优化掉参考和简单地通过值传递呢?
我在这里查看gcc优化选项http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
实际上,您的案例有一个选项:
-fipa-SRA
执行过程的标量替换聚合,删除未使用的参数以及通过值传递的参数替换参考传递的参数.
在-O2,-O3和-Os级别启用
据我所知,-O2是Linux上发布版本的常用选项.
所以,简短的回答是:好的编译器之一
虽然我实际上没有为此测试任何编译器,但我对此表示怀疑.您假设传递const引用与仅传递值无法区分,但这不是真的,并且编译器不应该假设它是.
由于引用是const,因此您的函数不能通过它修改值,但代码的其他部分可能可以访问原始(非const)变量,并可能修改它.例如,您的函数可能会调用其他一些更改它的函数,或者可能有另一个并发运行的函数.
如果其他内容修改了原始变量,则您的函数及其引用应该会看到新值.如果编译器用副本替换了引用,则该函数仍将看到旧值.
不过,您可能对Boost的呼叫特征库感兴趣.它提供了一个模板类型call_traits<T>::param_type,它是您不想复制的"大"类型的const引用,以及"小"类型的值,其中副本效率更高.基本上,您希望编译器隐式执行的操作,您可以使用您的代码进行显式操作.
| 归档时间: |
|
| 查看次数: |
2771 次 |
| 最近记录: |