1

我的目标是创建一个包含一个由类组成的元组的类,所有这些类都有一个方法 void update(),它允许以最小的开销连续调用所有包含的 update() 方法。这是我的代码:

template< typename... Tel >
class ExecSet
{
private:
  std::tuple<Tel...> m_data;

   //Compile-time Recursive
   template<int _iter, typename _Head, typename... _Tail>
   inline void _update()
   {
     std::get<_iter>(m_data).update();
     _update< _iter + 1, _Tail... >();
   }

   //Base case
   template<int _iter>
   inline void _update()
   {
     //Do nothing here
   }

public:
   inline void update()
   {
     _update<0, Tel...>();
   }
};

class Foo
{
//..
inline void update()
  {
    std::cout << "An update of Foo " << m_i << "\n";
  }

  private:
  int m_i;
};

class Bar
{
//..
inline void update()
  {
    std::cout << "An update of Bar " << m_i << "\n";
  }

  private:
  int m_i;
};

代码编译并按预期执行测试。我的问题是,我能否 100% 确定 ExecSet::update() 将与内部进行的每个递归调用一起完全内联?我想它应该是因为这一切都是在编译时确定的。在 -O3 下,所有内容都应该内联,对吗?

4

2 回答 2

2

你不能。即使您添加inline说明符,C++ 标准也不保证内联函数。

于 2013-07-20T15:58:58.453 回答
1

您可以要求编译器发出符号程序集而不是机器代码并自行检查。就是说,我自己已经多次这样做了,我敢肯定,没有一个认真的编译器会留下这样一个平凡的机会来内联未使用。现代编译器所做的事情,它们是纯粹的魔法

于 2013-07-20T19:51:33.703 回答