在C中“中毒一个功能”是什么意思?

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

>抛出一个constexpr函数
>声明一个未解析的extern const char *
>在引用中引用未解析的extern

我感觉我有点离开我的深度,但我很好奇:

>“毒药功能”是什么意思?
>他概述的技术的意义/用途是什么?

一般来说,它指的是使功能不可用。如果你想禁止在程序中使用动态分配,你可以“毒”malloc函数,所以它不能使用。

在视频中,他以更具体的方式使用它,这是清楚的,如果你阅读显示的幻灯片,当他谈到中毒的功能,这说“一种方式只强制编译时间?

所以他正在谈论“中毒”函数,使其在运行时不可用,所以它只能在常量表达式中调用。该技术是在函数中有一个分支,当在编译时上下文中被调用时,该分支不会被占用,并且使该分支包含将导致错误的东西。

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

因为未定义的符号在函数的编译时调用中不是“odr-used”,所以在实践中编译器不会创建对该符号的引用,因此它是未定义的。

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

一个可能有用的原因是当一些操作的编译时版本不是尽可能高效时。对constexpr函数中允许的表达式类型有限制(特别是在C 11中,在C 14中删除了一些限制)。所以你可能有两个版本的函数执行一个计算,一个是最佳的,但使用的表达式不允许在一个constexpr函数,一个是一个有效的constexpr函数,但是如果在run-时间。您可能毒化次优的,以确保它从不用于运行时调用,确保更高效(非constexpr)版本用于运行时调用。

N.B.在编译期使用的constexpr函数的性能并不重要,因为它没有运行时开销。它可能通过使编译器执行额外的工作来减慢编译速度,但它不会有任何运行时性能成本。

http://stackoverflow.com/questions/33964621/what-does-it-mean-to-poison-a-function-in-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:在C中“中毒一个功能”是什么意思?