我对在C ++中编写尽可能灵活的计算代码的最佳方法有疑问,我举个例子:
我正在编写一个操作网格(有限元计算)的代码,基本上是一组节点和连接。我们现在只专注于Node结构:
struct Node { double x,y,z; };
我有一套使用此Node数据结构实现的算法。
但是我想使用一个在网格上提供特定几何处理的外部库(由同事写),它有一个不同的Node数据结构
struct LibNode { double x; int idx; double y,z;};
注意: int idx在库中使用,我不需要/想要它在我自己的开发中。
该库的所有算法都是用这种结构编写的。 我只是在使用该库,对我而言,它只是一组处理,我可以应用于我用于计算的网格。
我想在用C编写的库中使用该算法,所以这里是我想象的解决方案:
将我的节点副本复制到一些LibNode,这是最简单的解决方案,但非常低效!
用LibNode重写我的代码,但是如果我想使用几个库呢?
重写lib!
我在这里有几个问题:
我错过了一个更好的解决方案吗?我觉得无论我做什么都无法避免使用库的数据结构。
由于性能是一个问题,目前我认为重写lib将是最好的解决方案。然后我将用C ++编写它,我不想犯原因而不是原始的lib。 我看到两个选项,lib的模板实现,更多"优雅"但是,一支坚持F77的物理学家团队也更难以编写和维护。 或者通过抽象类操作网格,并将数据结构定义委托给lib的用户。 但是通过虚拟方法访问数据(代码运行超过一百万次)对我来说似乎效率很低,我是对吗?
提前感谢您的回复!
答案 0 :(得分:2)
如果您的代码符合C,最简单的方法是使用Node
重建库,只需将Node更改为struct Node { double x; int idx; double y,z;};
即可。对成员x
,y
和z
的所有访问权限都应正常运行,并且idx
节点将或多或少地作为填充处理。毕竟,这是使用结构来维护应用程序的最佳点之一:您可以添加对现有代码没有或几乎没有变化的成员
当然,如果你假设某个地方&node.y == &node.x + 1
一切都会破裂......
我能想到的唯一可能是有问题的是加载可能作为一个整体保存到二进制文件的结构。应该重写那部分(和保存部分)以明确地保存和恢复成员而不是整个结构 - 无论如何保存整个结构是不可移植的,如果可能应该避免。
另一个问题,主要是如果它被用作DLL,它将是一个重大变化,因为它会破坏兼容性,所以你应该考虑使用你的库重建所有程序。