C++ “使用”的间接费用`

C++ “使用”的间接费用`,c++,optimization,type-alias,C++,Optimization,Type Alias,对于我的问题,我可以通过两种方式使用using指令。它们基本上可以归结为以下几种选择: template<typename U> struct A { private: // Define our types using WrapperType = Wrapper<U>; public: U *operator()(U *g) const { // TODO: use WrapperType } }; 模板 结构A{

对于我的问题,我可以通过两种方式使用
using
指令。它们基本上可以归结为以下几种选择:

template<typename U>
struct A {
private:

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

public:

    U *operator()(U *g) const {
       // TODO: use WrapperType 
    }
};
模板
结构A{
私人:
//定义我们的类型
使用WrapperType=Wrapper;
公众:
U*运算符()(U*g)常量{
//TODO:使用包装器类型
}
};
或:

结构B{ 模板 U*运算符()(U*g)常量{ //在这里定义类型。 使用WrapperType=Wrapper; //TODO:使用包装器类型 } }; 在这两种情况下,都会有其他类模板参数。因此,
B
仍然会有模板参数,即使在这个简化的示例中看起来不是这样

我的问题是:

像在
B
中那样在本地定义一个类型是否有开销?(与
A
相比时)

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

也就是说,
B
在我们的例子中更可取,因为我理想地希望用各种类型调用此代码。是的,这确实需要在课堂上。我刚才把这个例子简化得非常简单

像在B中那样在本地定义一个类型,[在生成的代码上]有没有开销

没有


定义类型别名(如何使用WrapperType=Wrapper;)只影响编译,一旦运行开始,就完全被删除。

您所做的一切都是定义类型别名——除非我错过了一些对运行时性能没有影响的东西。您使用的是某种解释的C++实现吗?或者编译到某个目标机器代码?区别在于类型别名的范围-在第二种情况下,它不能用于
B
的其他成员函数,除非它们也这样做。从维护的角度来看,这是一种权衡,即哪种更好取决于代码的整体结构。typedef只是编译器的信息,它们不会影响生成的代码。您只需要小心,不要在添加/移动typedef后意外使用另一个类型。@YSC-即使对我来说,这也太挑剔了:)我只是想向OP保证,这不太可能是我想要听到的。。。我以为这就是答案,但我只是想确定一下。
struct B {

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

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

       // TODO: use WrapperType 
    }
};