问题标签 [scopeguard]

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 回答
418 浏览

c++ - C++ 中 golang 样式延迟范围保护的性能

在阅读了关于在 C++ 中实现 Go 的延迟的问题后:

C ++中的golang风格的“延迟”

我对其中一个答案中给出的 go-defer like guard 子句的性能有疑问。它使用了一个 shared_ptr 删除器,它忽略了传递的对象地址。

如果删除器忽略了使用未命名参数的地址,它是否仍会在堆栈上传递。

以下任何一种实现延迟的方式会有什么不同吗?

0 投票
2 回答
80 浏览

c++ - 零开销的 C++ 范围保护

在 C++ 中,我们可以通过放入本地对象的析构函数来确保foo在退出作用域时被调用。foo()当我领导“范围守卫”时,这就是我的想法。有很多通用的实现。

我想知道——只是为了好玩——与仅foo()在每个退出点写入相比,是否有可能以零开销实现范围保护的行为。

零开销,我认为:

至少 1 个字节的开销,为范围保护提供地址:

编译器会优化给出sg地址吗?

一个稍微复杂一点的案例:

相对

的生命周期bar完全包含 的生命周期sg及其持有的 lambda(以相反的顺序调用析构函数),但持有的 lambdasg仍然必须持有对bar. 例如,我的意思是在我的 64 位系统上int x; auto l = [&]{return x;};提供。sizeof(l) == 8

是否有一些模板元编程魔法可以在scope_guard没有任何开销的情况下实现糖?