【问题标题】:Overhead of `using``using` 的开销
【发布时间】:2018-10-03 06:09:25
【问题描述】:

对于我的问题,我可以通过两种方式使用using 指令。他们基本上归结为这些选项:

template<typename U>
struct A {
private:

    // Define our types
    using WrapperType = Wrapper<U>;

public:

    U *operator()(U *g) const {
       // TODO: use WrapperType 
    }
};

或:

struct B {

    template <typename U>   
    U *operator()(U *g) const {

       // Define the types here instead.
       using WrapperType = Wrapper<U>;

       // TODO: use WrapperType 
    }
};

在这两种情况下,都会有其他类模板参数。所以B 仍然有模板参数,即使它在这个简化的例子中看起来不像。

我的问题是:

B 这样在本地定义类型是否有任何开销? (与A相比)?

我不清楚类型声明如何影响生成的代码。代码必须实时运行,这将是代码库的核心。所以如果有任何开销,我不能使用B

话虽如此,在我们的例子中,B 更可取,因为理想情况下,我希望使用多种类型调用此代码。是的,这确实需要在课堂上。我刚刚非常简化了这个例子。

【问题讨论】:

  • 你所做的只是定义一个类型别名——除非我遗漏了一些不应该对运行时性能产生任何影响的东西?
  • 您是否在使用某种解释型 C++ 实现?还是编译成一些目标机器码?
  • 区别在于类型别名的范围 - 在第二种情况下,它不能用于B 的其他成员函数,除非它们也这样做。从维护的角度来看,这是一种权衡,即哪个更好取决于代码的整体结构。
  • Typedefs 只是编译器的信息,它们不会影响生成的代码。您只需要注意不要在添加/移动 typedef 后意外使用其他类型。
  • @YSC - 这对我来说也太挑剔了 :) 我只是想向 OP 保证这不太可能

标签: c++ optimization type-alias


【解决方案1】:

在本地定义类型(如在 B 中)是否有任何开销[在生成的代码上]?

没有。

定义类型别名(您对using WrapperType = Wrapper&lt;U&gt;; 所做的操作)仅影响编译,并在运行时开始后完全删除。

【讨论】:

  • 正是我想听到的……我以为这就是答案,但我只是想确定一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 2012-07-27
相关资源
最近更新 更多