问题标签 [static-dispatch]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java中的绑定和调度有什么区别?
关联的名字太多了:Early and Late Binding、Static and Dynamic Dispatch、Runtime vs. Compile-time Polymorphism等等,我不明白其中的区别。
我找到了一个明确的解释,但它正确吗?我将解释JustinC:
绑定:是确定一个变量(对象?)的类型。如果它是在编译时完成的,它的早期绑定。如果它在运行时完成,则为后期绑定。
Dispatch:正在确定哪个方法与方法调用匹配。静态分派是在编译时计算方法,而动态分派是在运行时进行。
绑定是否分别将原始变量和引用变量与原始值和对象匹配?
编辑:请给我一些明确的参考资料,以便我可以阅读更多相关信息。
swift - 增加动态调度的使用会减少编译时间吗?
很快,编译时间真的很慢,项目中的代码量会增加。所以我一直在寻找减少时间的方法。一种方法可能是使用语言关键字 likefinal
或static
更改编译器在这种情况下使用静态和动态分派处理代码的方式。
但据我所知,最好避免运行时开销减少动态调度
所以我的第一个疑问是,如果在运行时使用更多动态调度尽我所能减少编译时间,但会以运行时开销为代价。
我的第二个疑问是运行时开销如此糟糕?您可以牺牲编译时间以减少开销吗?
c++ - C++ 静态多态性——从基类指针引用派生类中重载的专用模板方法
我正在用 C++ 实现观察者模式的变体。但是,由于我项目的性质,它不能使用任何虚拟成员函数,因为 vtable 查找和缓存未命中的总开销是不可接受的。
如果我通过虚拟成员函数创建接口,我会简单地编写以下内容:
然后,例如,我可以有MessageSubscriber
一些实现MessageType
,的类SafetyMessage
,如下所示:
这将完成工作,但是,正如前面所强调的,vtable 查找开销在应用程序的上下文中是不可接受的,尽管它提供了多态便利,并且应用程序也需要它。然后,自然地,我尝试了几种围绕可以通过模板利用的静态多态性的方法。
我第一次尝试使用 CTRP,但在这种情况下它失败了,因为其中包含的指针在被调用MessagePublisher::subscribers
时必须指向同一个基类。MessagePublisher::Publish(MessageType *message)
因此,您不能有一些 CTRP 模式 MessageSubscriber<SafetyMessageSubscriberA>
,MessageSubscriber<SafetyMessageSubscriberB>
因为模板参数需要相同才能合法地允许两个对象进入MessagePublisher::subscribers
。
我最近对该问题的尝试使我尝试了成员函数模板专业化的一些变体,尽管没有成功。我在模式界面上尝试了以下变体:
使用以下实现:
但是,当我尝试这样做时,总是会调用基类MessagePublisher::Publish(SafetyMessage *message)
的通用实现,而不是为特定于.MessageSubscriber::OnMessage(MessageType *m)
SafetyMessage*
我是否按预期错误地专门化了功能模板,还是有另一种更有效的解决方案?对于与重载和成员模板专业化的概念有关的任何不精确的措辞,我提前道歉。
ios - 在扩展 swift 中覆盖 - 不能或不应该?
下面是我的代码片段?
根据苹果文档,您不应在扩展中覆盖。我明白这一点。现在我在这段代码中没有收到错误,我的应用程序中的所有开关都以红色作为色调。
我读过文章,这是因为动态调度,因为 UISwitch 是由 NSObject 继承的类。
有人可以帮我理解这个概念吗?为什么我们不应该这样做?如果 swift 是静态调度,这仍然如何工作?
generics - 如何对包含不同类型的链表进行静态调度,这些类型都实现了一个特征?
我有这个工作代码:
我想要一个使用静态调度的版本:
替换问号的类型实现Renderable
,但不一定R
,T: Renderable
例如可以。我想避免使用任何解决方案dyn Renderable
来保持静态调度。
该类型T: Renderable
在实例化时是已知的Layer
并且不会改变。
c++ - 如何验证访问者(变体)静态调度与多态动态调度基准的结果?
我一直在尝试std::variant
使用std::visit
.
这个想法是,而不是
我有
我想测量构建一系列此类对象的速度有多快以及调度的速度有多快。请注意,第一个示例(A/Bs...)在动态调度之上需要动态内存,而第二个示例(Cs...)具有自动存储。
为此,我将 B0 和 C0 推广到类型模板中:
然后编写了一个(可能稍微过度设计的)测试工具来填充 astd::vector
并将其读回。完整的代码附在下面。我正在使用C++17运行-O1
它。-O3
bs
实际上,它分别用B<...>
和伪随机地填充预先生成的向量cs
,C<...>
然后调用bs[i]->f()
或std::visit([](auto const& c) { return c.f(); },cs[i])
(有关更多详细信息,请参见附加的基准代码)。
我所期望的是,一个测试实例会将variant<C<0>>
其动态对应部分从水中吹出几个unique_ptr<A>
数量级(确实如此),但是随着我增加变体,开始variant<C<0>,...,C<127>>
的效率visit
会显着下降到这一点动态调度更快的地方(它不像预期的那样)。
使用-O3
(-O1
结果非常相似)我看到以下结果,这些结果在运行中略有不同,但似乎相对稳定(时间大多保持在 10% 的偏差内)。
讨论
我认为,(L1)的小时间可以通过缓存和/或分支预测来解释。(L2) 完全符合预期:如果变体是微不足道的,则调度非常快。构造的所有时间也是有意义的:ctor variant
在任何时候都没有任何意义malloc
,因此很清楚为什么它比动态类型快得多,ctor virtual
并且无论动态类型的数量如何,时间都大致恒定。
call virtual
与动态类型的数量增加(L3)大致相同,这应该是可以预料的。但是,为什么call variant
(L4.1) 和 (L4.3) 之间没有上升(更多)。
注意:鉴于我的测试工具中模板编程的限制,如果在编译期间不爆炸 g++/耗尽我的内存,我无法进一步增加范围。
无论如何,假设测试功能f
尽可能简单,这意味着测量尽可能准确地记录所产生的开销。
验证
问题是,
- 我如何验证这些结果以使其具有代表性和
- 确保编译器没有优化相关部分?
- 其他基准是否得出相同的结论,即
std::variant
调度总是快大约 2-3 倍?
完整的基准
rust - Rust 特征有运行时开销吗?
如果我在下面的代码中创建c1
类型,是否有任何运行时开销?Concrete1
这是否需要任何类型的 v-table 查找或任何其他类型的开销?我想要一个特征,以便我可以在编译时强制执行Concrete1
并Concrete2
实现相同的方法集。
我将静态选择在主程序中使用哪种具体类型;这两个实现的存在只是为了在需要时我可以使用该特征的替代实现。
swift - 结构类型可以快速静态调度吗?
我想我几乎明白什么是静态或动态调度。
据我所知,具有struct 类型的struct instance将始终为static dispatch。
但是,具有协议类型(使用协议方法)的结构实例将在不使用协议和扩展的情况下进行动态调度。
所以,我只是想知道“结构类型 可以动态调度吗?” 如果愿意,你能告诉我一些例子吗?⬇️ ?? 是任何事例
multithreading - 什么时候适合为静态调度实现 Send + Sync
我发现自己在玩warp。
我想使用static dispatch将数据库 Trait 传递给warp::Filter,这样具体的数据库可能会有所不同。
我读到 Send + Sync实施起来不安全,但我不完全理解何时实施它们是合适的。
在这种情况下实现 Send + Sync 是否合理:
编辑:
是的,这个例子是完全合理的!
正如@trentcl 和@Masklinn 所指出的,我实际上并没有实现Send + Sync,我只是要求传递给过滤器的任何类型T,实现Send + Sync Traits,这是完全安全的Rust。