从c ++创建新的Function<T>
时,v8要求C回调的SideEffektType
。
在v8.h中将其描述为Options for marking whether callbacks may trigger JS-observable side effects.
。
可观察到的副作用在这里仍然有很多猜测。例如,如果您实现了一个打印到std::cout
的函数,则没有JS可观察到的副作用,但是您仍然不希望编译器重新编译或忽略对该函数的调用。
另一个问题是,如果将c对象的getter和setter导出为js函数,如何标记我们的函数。它们确实具有明显的副作用-省略或重新编排可能会破坏语义-但它们不会更改当前的堆栈框架或任何全局变量,从而使v8具有很大的优化潜力。
我们很想知道v8中如何使用此属性,因为这应该有助于回答对每个函数使用哪个标志。
答案 0 :(得分:0)
好吧,请看SideEffectType枚举的文档:
/**
* Options for marking whether callbacks may trigger JS-observable side effects.
* Side-effect-free callbacks are whitelisted during debug evaluation with
* throwOnSideEffect. It applies when calling a Function, FunctionTemplate,
* or an Accessor callback. For Interceptors, please see
* PropertyHandlerFlags's kHasNoSideEffect.
* Callbacks that only cause side effects to the receiver are whitelisted if
* invoked on receiver objects that are created within the same debug-evaluate
* call, as these objects are temporary and the side effect does not escape.
*/
因此,这与优化潜力无关。 (请放心,V8知道读写属性之间的顺序要求;对此不需要特殊的注释。)
因此,换句话说:
kHasNoSideEffect
kHasSideEffectToReceiver
kHasSideEffect
。可以打印到std::cout
的函数也可能属于此类别,但是由您决定如何感觉可能向std::cout
发送垃圾邮件。如果您不使用调试评估,那么您甚至都不会看到差异。答案 1 :(得分:0)