技术实现多态性,但节省4字节
本文关键字:节省 4字节 实现 多态性 技术 | 更新日期: 2023-09-27 17:48:58
我在模板元数据编程中遇到了一种技术,它允许在不使用虚函数机制的情况下实现多态性。
因此,我想知道是否有一些其他的技巧可以用来做多态行为在c++或c# ?
编辑:不久前我读到访问者设计模式是虚拟机制的另一种选择,但想不起来这篇文章。有人能确认一下这个词也可以用吗?
EDIT2:我知道这不是一个理想的编程实践,但黑客是我正在寻找的,因为优化是主要关注的。类的层次结构是在编译时分配的(指针不是在运行时通过if-else逻辑等分配给类的)
您是否曾经想过为什么每次使用多态性往往会增加大约4个字节的开销?这是因为是实现多态性最简单、最实用的方法。有一些奇怪的hack可以用更少的开销来模拟c++/c#/Objective-C多态性,但是它们有很大的权衡——例如,每次调用的CPU使用量是几倍,或者静态存储的类层次结构具有有限的可扩展性。
多态性的实现方式是这样的,因为它的实现方式已经是最优的。
(编辑:这是在c#上下文中的答案)
无论如何,你不会为每个对象节省4个字节。该类型仍然有一个虚函数表来查找函数成员实现。通过避免使用虚方法,您可能会在该表中保存一个条目,但这是单个对象中的单个条目-它不会对每个实例产生影响。 不是你错过了什么,就是我错过了。如果你可以编辑问题,以显示你试图在最自然的实现中做什么,然后解释你试图在哪里节省空间,这将会有所帮助。模板只能用于实现编译时多态性。我不知道有什么机制可以在不增加空间开销的情况下实现运行时多态性,但这有什么关系呢?如果您需要运行时多态性来解决您的问题,您应该使用它。
如果你真的想节省内存,你可以实现你自己的内存处理。块页眉和页脚每个都大于4字节(我认为它们每个都是8字节),所以把所有东西都放在一个巨大的内存块中,并做自己的索引将是一种方法。甚至不要使用对象,只使用二进制索引。
我的观点是,除非你在设计低级数据库、操作系统内核或SOC,否则你真的不应该担心这个问题。尤其是c#。你知道垃圾收集有多少开销吗?
有很多不同的技巧,从众所周知的技术(例如,c++中的CRTP)到相当丑陋的hack(我曾经通过消除虚值表指针将特定程序的容量大约增加了五倍;相反,我为每个类实现了一个单独的分配器,并根据对象的地址找到了正确的虚函数表)。
访问者模式实际上只是取代多态性,而不是取代多态性。换句话说,在被访问的类中可能/可能是多态行为的东西被移到了访问者类中。但是,要获得动态绑定,仍然需要访问者类的层次结构,通常使用常用的虚函数表机制来实现多态性。在适当的情况下,这仍然可以节省相当数量的内存,因为访问者对象的数量通常比它们访问的对象的数量要小得多。
Variant是访问者设计模式的c++库实现,它避免了动态多态性。
对于您的启发,您提到的c++静态多态性方法有一个名称:CRTP。