gpt4 book ai didi

c++ - C++ 中的 "poison a function"是什么意思?

转载 作者:IT老高 更新时间:2023-10-28 11:56:34 28 4
gpt4 key购买 nike

在 Scott Schurr 演讲的最后 "Introducing constexpr" at CppCon ,他问“有没有办法毒化一个功能”?然后他解释说,这可以通过以下方式完成(尽管以非标准方式):

  1. throw 放入 constexpr 函数
  2. 声明一个未解析的extern const char*
  3. throw
  4. 中引用未解析的 extern

我觉得我在这里有点超出我的深度,但我很好奇:

  • “毒化函数”是什么意思?
  • 他概述的技术的意义/用处是什么?

最佳答案

一般来说,它是指使函数无法使用,例如如果你想禁止在程序中使用动态分配,你可以“毒化” malloc 函数,使其无法使用。

在视频中,他以更具体的方式使用它,如果您阅读显示的幻灯片,当他谈到中毒功能时,就会清楚这一点,上面写着“仅强制编译时的方法?”

所以他说的是“毒化”函数以使其在运行时无法调用,因此它只能在常量表达式中调用。该技术是在函数中拥有一个在编译时上下文中调用时永远不会采用的分支,并使该分支包含会导致错误的内容。

throw 表达式在 constexpr 函数中是允许的,只要在函数的编译时调用期间永远不会到达它(因为你不能在编译时抛出异常,它是一个固有的动态操作,如分配内存)。因此,引用 undefined symbol 的 throw 表达式将不会在编译时调用期间使用(因为这将无法编译)并且不能在运行时使用,因为 undefined symbol 会导致链接器错误。

因为 undefined symbol 在函数的编译时调用中不是“odr-used”,实际上编译器不会创建对该符号的引用,所以它是未定义的也没关系。

有用吗?他在演示如何 去做,不一定说这是一个好主意或广泛有用。如果您出于某种原因需要这样做,那么他的技术可能会解决您的问题。如果您不需要它,则无需担心。

可能有用的一个原因是,当某些操作的编译时版本没有达到应有的效率时。 constexpr 函数中允许的表达式类型存在限制(特别是在 C++11 中,C++14 中删除了一些限制)。因此,您可能有两个版本的函数用于执行计算,一个是最佳的,但使用了 constexpr 函数中不允许的表达式,另一个是有效的 constexpr 函数,但如果在运行时调用会表现不佳-时间。您可以毒化次优版本以确保它永远不会用于运行时调用,从而确保将更有效的(非 constexpr)版本用于运行时调用。

注意在编译时使用的 constexpr 函数的性能并不重要,因为它无论如何都没有运行时开销。它可能会通过让编译器做额外的工作来减慢你的编译速度,但它不会有任何运行时性能成本。

关于c++ - C++ 中的 "poison a function"是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33964621/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com