正在删除虚拟继承
Removing Virtual Inheritance
我正在处理一个嵌入式项目,我正试图删除一个已实现+/-*的虚拟数字类。删除这个类节省了很多代码空间,所以我用以下函数替换了+,
if (BASE(h)->type() == FLOAT && BASE(v)->type() == FLOAT)
{
res = FLOAT(h)->floatValue() + FLOAT(v)->floatValue();
}
else if (BASE(h)->type() == INTEGER && BASE(v)->type() == INTEGER)
{
res = INTEGER(h)->intValue() + INTEGER(v)->intValue();
}
else if (BASE(h)->type() == INTEGER && BASE(v)->type() == FLOAT)
{
res = INTEGER(h)->floatValue() + FLOAT(v)->floatValue();
}
else
{
res = FLOAT(h)->floatValue() + INTEGER(v)->floatValue();
}
有没有一种不那么丑陋的方法来实现这一点?因为我必须使用相同的方案进行其他操作和比较?
#define GETFLOAT(arg) (BASE(arg)->type() == INTEGER ? INTEGER(arg)->floatValue() : FLOAT(arg)->floatValue())
switch(BASE(h)->type()) {
case INTEGER:
if (BASE(v)->type() == INTEGER) {
res = INTEGER(h)->intValue() + INTEGER(v)->intValue();
break;
}
case FLOAT:
res = GETFLOAT(h) + GETFLOAT(v);
}
实际上,它在h
的类型上分支了两次,但只有在(你在其他地方的评论中说)无论如何都很昂贵的情况下,浮点运算。使用goto
可以避免这种情况,但我不会再讨论这种论点了。类似于:
switch(BASE(h)->type()) {
case INTEGER:
if (BASE(v)->type() == INTEGER) {
res = INTEGER(h)->intValue() + INTEGER(v)->intValue();
goto finished; // or better: return res;
}
hvalue = INTEGER(h)->floatValue()
break;
case FLOAT:
hvalue = FLOAT(h)->floatValue();
}
res = hvalue + GETFLOAT(v);
finished:
和霍华德的答案一样,如果BASE()
或type()
很贵,那么你可以为每个论点计算一次答案,即使它使用了两次。
分两步做怎么样?
isInt1 = BASE(h)->type()==INTEGER;
isInt2 = BASE(v)->type()==INTEGER;
if (isInt1 && isInt2)
op1 = INTEGER(h)->intValue();
op2 = INTEGER(h)->intValue();
res = op1 + op2;
else {
op1 = isInt1 ? (FLOAT(h)->floatValue()) : (INTEGER(h)->floatValue());
op2 = isInt2 ? (FLOAT(v)->floatValue()) : (INTEGER(v)->floatValue());
res = op1 + op2;
}
我建议重新考虑您的体系结构。使用这种方法您节省了多少成本,在性能方面又花费了多少成本?您的新方法似乎将所有内容都推到了一个float(您没有显示res
的声明,我认为它是float res;
检查这个修复程序对(a+b)*c
之类的东西做了什么,其中a、b和c都是整数。有了这个修复程序,您现在有了一个浮点乘以int,这在计算上比int乘以int要贵得多。
我建议使用模板,让C++类型的系统处理尽可能多的转换。这使您可以使用不必具有公共虚拟基类的不同存储类型。
您还可以通过只实现int+float与float+int中的一个来减少程序大小(类似地,实现int*float与浮点*int)。暂时实现int+float和float+int,但有意使其中一个引发编译时错误。翻转出现故障的操作数的顺序。
相关文章:
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 大小虚拟继承中的派生类
- 删除C++继承中虚拟类成员的代码重复
- 重写虚拟函数和继承
- C++ 多级虚拟继承编译问题
- 如何正确获得虚拟继承?
- 编译时继承类中的隐式虚拟与显式虚拟
- 钻石继承虚拟成员铸造与指针
- CPP 继承虚拟方法解析顺序
- 关于C 接口(纯虚拟类)/多重继承/虚拟继承的设计Qustion
- 继承虚拟类C 的派生类
- 多个继承/虚拟函数
- 不能从具有虚拟继承(C++虚拟继承)的类派生
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- 为什么我不能继承虚拟基的构造函数?
- C++继承虚拟函数崩溃
- c++多重继承/虚拟继承
- 派生类的成员函数是否从基类继承虚拟性?
- 继承虚拟函数的类的boost::optional失败的原因
- c++继承虚拟函数