问题标签 [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.

0 投票
1 回答
110 浏览

clojure - 我们可以使用宏在 Clojure 中对返回类型进行静态调度吗?

现在我们知道 Clojure 协议上的调度,严格来说,是动态的

我们在这里看到了一个使用宏进行编译时调度的绝妙示例:

在这里,作者认为您永远无法在 Clojure 中根据返回类型进行调度。对我来说,似乎有了足够强大的宏,你可以做任何事情。

我的问题是:我们可以使用宏在 Clojure 中对返回类型进行静态调度吗?

0 投票
3 回答
1547 浏览

java - Java中的绑定和调度有什么区别?

关联的名字太多了:Early and Late Binding、Static and Dynamic Dispatch、Runtime vs. Compile-time Polymorphism等等,我不明白其中的区别。

我找到了一个明确的解释,但它正确吗?我将解释JustinC

绑定:是确定一个变量(对象?)的类型。如果它是在编译时完成的,它的早期绑定。如果它在运行时完成,则为后期绑定。

Dispatch:正在确定哪个方法与方法调用匹配。静态分派是在编译时计算方法,而动态分派是在运行时进行。

绑定是否分别将原始变量和引用变量与原始值和对象匹配?

编辑:请给我一些明确的参考资料,以便我可以阅读更多相关信息。

0 投票
1 回答
252 浏览

swift - 增加动态调度的使用会减少编译时间吗?

很快,编译时间真的很慢,项目中的代码量会增加。所以我一直在寻找减少时间的方法。一种方法可能是使用语言关键字 likefinalstatic更改编译器在这种情况下使用静态和动态分派处理代码的方式。

但据我所知,最好避免运行时开销减少动态调度

所以我的第一个疑问是,如果在运行时使用更多动态调度尽我所能减少编译时间,但会以运行时开销为代价。

我的第二个疑问是运行时开销如此糟糕?您可以牺牲编译时间以减少开销吗?

0 投票
1 回答
99 浏览

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*

我是否按预期错误地专门化了功能模板,还是有另一种更有效的解决方案?对于与重载和成员模板专业化的概念有关的任何不精确的措辞,我提前道歉。

0 投票
0 回答
179 浏览

ios - 在扩展 swift 中覆盖 - 不能或不应该?

下面是我的代码片段?

根据苹果文档,您不应在扩展中覆盖。我明白这一点。现在我在这段代码中没有收到错误,我的应用程序中的所有开关都以红色作为色调。

我读过文章,这是因为动态调度,因为 UISwitch 是由 NSObject 继承的类。

有人可以帮我理解这个概念吗?为什么我们不应该这样做?如果 swift 是静态调度,这仍然如何工作?

0 投票
1 回答
82 浏览

generics - 如何对包含不同类型的链表进行静态调度,这些类型都实现了一个特征?

我有这个工作代码:

我想要一个使用静态调度的版本:

替换问号的类型实现Renderable,但不一定RT: Renderable例如可以。我想避免使用任何解决方案dyn Renderable来保持静态调度。

该类型T: Renderable在实例化时是已知的Layer并且不会改变。

0 投票
0 回答
42 浏览

c++ - 如何验证访问者(变体)静态调度与多态动态调度基准的结果?

我一直在尝试std::variant使用std::visit.

这个想法是,而不是

我有

我想测量构建一系列此类对象的速度有多快以及调度的速度有多快。请注意,第一个示例(A/Bs...)在动态调度之上需要动态内存,而第二个示例(Cs...)具有自动存储。

为此,我将 B0 和 C0 推广到类型模板中:

然后编写了一个(可能稍微过度设计的)测试工具来填充 astd::vector并将其读回。完整的代码附在下面。我正在使用C++17运行-O1它。-O3

bs实际上,它分别用B<...>和伪随机地填充预先生成的向量csC<...>然后调用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尽可能简单,这意味着测量尽可能准确地记录所产生的开销。

验证

问题是,

  1. 我如何验证这些结果以使其具有代表性和
  2. 确保编译器没有优化相关部分?
  3. 其他基准是否得出相同的结论,即std::variant调度总是快大约 2-3 倍?

完整的基准

0 投票
1 回答
578 浏览

rust - Rust 特征有运行时开销吗?

如果我在下面的代码中创建c1类型,是否有任何运行时开销?Concrete1

这是否需要任何类型的 v-table 查找或任何其他类型的开销?我想要一个特征,以便我可以在编译时强制执行Concrete1Concrete2实现相同的方法集。

我将静态选择在主程序中使用哪种具体类型;这两个实现的存在只是为了在需要时我可以使用该特征的替代实现。

0 投票
0 回答
125 浏览

swift - 结构类型可以快速静态调度吗?

我想我几乎明白什么是静态或动态调度。

据我所知,具有struct 类型的struct instance将始终为static dispatch

但是,具有协议类型(使用协议方法)的结构实例将在不使用协议和扩展的情况下进行动态调度

所以,我只是想知道结构类型 可以动态调度吗?” 如果愿意,你能告诉我一些例子吗?⬇️ ?? 是任何事例

0 投票
1 回答
68 浏览

multithreading - 什么时候适合为静态调度实现 Send + Sync

我发现自己在玩warp

我想使用static dispatch将数据库 Trait 传递给warp::Filter,这样具体的数据库可能会有所不同。

我读到 Send + Sync实施起来不安全,但我不完全理解何时实施它们是合适的。

在这种情况下实现 Send + Sync 是否合理:

编辑:

是的,这个例子是完全合理的!

正如@trentcl 和@Masklinn 所指出的,我实际上并没有实现Send + Sync,我只是要求传递给过滤器的任何类型T,实现Send + Sync Traits,这是完全安全的Rust。