问题标签 [function-attributes]

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

python - 访问装饰器内部的函数属性

是否可以访问装饰器内的函数属性?考虑下面的一段代码。

我预计输出是:

但我收到以下错误:

有什么办法可以使这项工作

输出:

正如预期的那样。

0 投票
0 回答
2163 浏览

python - Python 中的状态变量:何时选择类、非局部变量或函数属性

在 python 中,有(至少)三种不同的方法来跟踪函数的状态信息(显然,这些示例没有任何有意义的方式来使用状态信息):

面向对象类:

非局部变量(Python 3):

或功能属性:

我了解每种方法的工作原理,但我无法解释为什么(除了熟悉之外)您会选择一种方法而不是另一种方法。继 Python 之禅之后,类似乎是最优雅的技术,因为它消除了嵌套函数定义的需要。然而,与此同时,类可能会引入比所需更多的复杂性。

在权衡在程序中使用哪种方法时应该考虑什么?

0 投票
1 回答
424 浏览

c++ - 声明为 __attribute__ ((pure)) 的函数是否允许返回新构造的 std::string

在带有 GCC 编译器的 C/C++ 的 gnu 世界中,有通用函数属性“纯”(类似于“const”属性,但限制较少):

许多函数除了返回值外没有任何影响,它们的返回值仅取决于参数和/或全局变量。...纯函数的一些常见示例是 strlen 或 memcmp。... pure 属性对函数的定义施加了与 const 属性类似但更宽松的限制:它允许函数读取全局变量。...因为纯函数不能有任何副作用,所以这样的函数返回 void 是没有意义的。

是否允许纯函数调用任何 C++ STL 构造函数,例如std::stringor std::vector?例如,此代码是否合法,为什么不合法?(这是否合法__attribute__((const))?)

有一些对复杂 std::sting 构造函数的调用,它可能分配内存并写入一些用于管理空闲和分配内存的全局变量:

例如,在将"/""\\"常量的长度更改为 100 个字符后,我从构造函数中调用了new和调用:malloc(101)

0 投票
0 回答
60 浏览

linux - 标记功能仅在锁定下使用

我正在编写一个 linux 内核驱动程序,并且我有一个必须在锁定下调用的函数,我想确保没有人会在没有获得锁定的情况下使用它。在调用函数之前,从不同的函数中多次调用此函数,这些函数获取了锁。

我想知道是否有一种方法可以告诉编译器验证对该函数的所有调用都是在锁定下完成的?像函数属性或类似的东西。

谢谢。

0 投票
2 回答
533 浏览

c++ - [[gnu::pure]] 函数属性和线程的优化问题

我有一个程序在 gcc 上几乎立即结束-O0,但在 gcc 和-O3. 如果我删除[[gnu::pure]]函数属性,它也会立即退出,即使该函数没有修改全局状态。该程序位于三个文件中:

thread.hpp

thread.cpp

main.cpp

这是编译器错误吗?缺乏正确使用注意事项的文档[[gnu::pure]]?对文档的误读导致[[gnu::pure]]我编写了一个错误?

0 投票
1 回答
46 浏览

python - 功能属性寿命

我正在编写一个函数的备忘录,我想在函数对象中存储一个属性。函数属性在进程的生命周期内是否可用?如果不是我怎么能做到这一点?

谢谢

0 投票
0 回答
113 浏览

c++17 - 更标准的 __attribute__((warning("msg"))

在我的 C++ 库中,我有一个仍然存在的函数,1) 用于调试 2) 用于小型操作。该功能基本上是更高效版本的非常缓慢的回退。(例如,考虑单个分配与 memcpy 的循环)>

出于这个原因,我想在函数被直接或间接实例化后立即发出警告。在没有警告的情况下,很难测试函数是否被实例化调用,因为函数可能通过几层模板代码被实例化调用。

我发现 GCC 的__attribute__((warning("slow function!")))工作做得很好。

但是它不是标准的或与clang不兼容。

这种编译时警告有更好的选择吗?

看起来有一个标准[[deprecated("msg")]]属性也可以完成这项工作,问题是它令人困惑,因为这个函数没有被弃用,它是为了方便而存在的。

还有一个,我最近发现了一个#pragma poison可能适用于这里,但是我不明白它是怎么用的,而且这个函数实际上是一个模板类的成员函数,例子中没有考虑这种情况。https://www.fluentcpp.com/2018/09/04/function-poisoning-in-cpp/

0 投票
2 回答
165 浏览

c - 为什么在 GCC 中错误使用 __attribute__((pure)) 没有给出警告?

我正在尝试理解纯函数,并且一直在阅读有关该主题的维基百科文章。我编写的最小示例程序如下:

我用 编译了这个程序gcc -O2 -Wall -Wextra,期望impure_function()__attribute__((pure)). 但是,我没有收到任何警告或错误,并且程序也没有问题地运行。

标记impure_function()__attribute__((pure))正确吗?如果是这样,为什么它编译时没有任何错误或警告,即使使用-Wextraand-Wall标志?

提前致谢!

0 投票
1 回答
91 浏览

d - `std.format.format!` 的纯版本?

我想将双精度转换为纯函数中的字符串。我很困惑为什么这不是纯粹的:

有没有办法以某种方式实现此功能,pure而无需重新实现将双精度转换为 base10 字符串的逻辑?

0 投票
1 回答
165 浏览

linux - asmlinkage 是指堆栈还是寄存器?

在大多数语言中,C 包含的堆栈用于函数调用。这就是为什么如果您在递归中不小心会出现“堆栈溢出”错误的原因。(双关语不是故意的)。

asmlinkage如果这是真的,那么GCC 指令有什么特别之处。

它说,来自#kernelnewbies

asmlinkage 标签是关于这个简单函数的另一件事。这是一些 gcc 魔术的#define,它告诉编译器该函数不应该期望在寄存器中找到它的任何参数(一种常见的优化),而只能在 CPU 的堆栈上。

我的意思是我不认为寄存器用于正常的函数调用

更奇怪的是,当你了解到它是在 x86 上使用 GCC regparm 函数属性实现的。

regparm的文档如下:

在 x86-32 目标上,如果参数是寄存器 EAX、EDX 和 ECX 中的整数类型,而不是堆栈中的参数,则 regparm 属性会导致编译器将参数编号 1 传递给编号。

这基本上与asmlinkage正在尝试做的事情相反。

那么会发生什么?它们是在堆栈上还是在寄存器上。

我哪里错了?

信息不是很清楚。