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
}
};