【发布时间】: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