一个好的C++编译器会优化参考吗?

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&作为一个正式的参数在上面的功能,将编译器优化掉参考和简单地通过值传递呢?

Ale*_*mak 8

我在这里查看gcc优化选项http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

实际上,您的案例有一个选项:

-fipa-SRA

执行过程的标量替换聚合,删除未使用的参数以及通过值传递的参数替换参考传递的参数.

在-O2,-O3和-Os级别启用

据我所知,-O2是Linux上发布版本的常用选项.

所以,简短的回答是:好的编译器之一


Wyz*_*a-- 6

虽然我实际上没有为此测试任何编译器,但我对此表示怀疑.您假设传递const引用与仅传递值无法区分,但这不是真的,并且编译器不应该假设它是.

由于引用是const,因此您的函数不能通过它修改值,但代码的其他部分可能可以访问原始(非const)变量,并可能修改它.例如,您的函数可能会调用其他一些更改它的函数,或者可能有另一个并发运行的函数.

如果其他内容修改了原始变量,则您的函数及其引用应该会看到新值.如果编译器用副本替换了引用,则该函数仍将看到旧值.

不过,您可能对Boost的呼叫特征库感兴趣.它提供了一个模板类型call_traits<T>::param_type,它是您不想复制的"大"类型的const引用,以及"小"类型的值,其中副本效率更高.基本上,您希望编译器隐式执行的操作,您可以使用您的代码进行显式操作.

  • 你对线程不对.编译器优化器通常会破坏与"无锁"(天真)数据结构有关的代码.编译器doest需要考虑其他线程! (3认同)

Ben*_*igt 6

每当编译器能够内联时,产生的跨程序优化将消除查找和传递地址的费用.

对于非内联函数调用,引用可能将实现为指针,而不是按值传递.