问题标签 [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 回答
196 浏览

c++ - __attribute((const)) 的 gcc 行为不一致

我在 gcc 中遇到了一个非常奇怪的行为,涉及标有__attribute((const)). 逻辑和算术运算符导致不同的优化,我不明白为什么。

这并不是一个真正的错误,因为__attribute((const))它只是一个提示并且不能保证它的效果,但这仍然是非常令人惊讶的。有人有什么解释吗?

这是代码。所以我定义了一个__attribute((const))函数:

然后我定义了一个算子测试宏。这是通过宏而不是模板/仿函数来完成的,以向编译器提供简单的代码并简化优化:

最后,我测试了不同的运算符,如下所示。注释将输出与在和的g++-4.8 -std=c++11 -O2 -Wall -pedantic相同输出相匹配-O3-Ofast

我的问题是:为什么算术运算符会产生两个调用?为什么不能f()+f()优化为2*f()?有没有办法帮助/强制这种优化?起初我认为乘法可能更昂贵,但我尝试了f()+....+f()10 次加法仍然没有减少到10*f(). 此外,由于它是int算术运算,因此操作顺序无关紧要(与floats 相反)。

我还检查了 asm,但它没有帮助:所有整数似乎都是在编译时预先计算的。

0 投票
1 回答
304 浏览

gcc - const gcc 函数属性和全局 const 变量

来自GCC 文档

许多函数除了参数之外不检查任何值,并且除了返回值之外没有任何效果。基本上,这只是比上面的纯属性稍微严格的类,因为不允许函数读取全局内存。

我的问题是全局const值是否算作全局内存。我认为确实如此,但是我明确标记为不变的值可能会否定此处可能的优化,这似乎很奇怪。

例如:

根据ConstantModulusValue我的理解,使用 意味着不应标记此功能,这const对我来说再次显得很奇怪。const标记这个我看不到的东西有什么危险吗?

0 投票
1 回答
252 浏览

c - GCC 属性对嵌套函数的影响

只能为函数声明(而不是定义)指定函数属性。所以,我不能为嵌套函数指定属性。例如:

在这种情况下,“hot_nested_function”会被优化为“hot”吗?

UPD:在一个愚蠢的例子中,gcc(意味着gcc -O1和更高的优化级别)用它的主体替换函数调用,无论是有还是没有__attribute__ ((hot))(对于嵌套函数)。甚至没有任何关于嵌套函数的提醒。

UPD2:根据gcc.git/gcc/tree-nested.c解析父函数引用、外部标签跳转等。在下一阶段,嵌套函数将转换为具有内联能力的独立函数。但目前还不清楚父函数的属性。他们申请嵌套了吗?

0 投票
2 回答
175 浏览

python - 重新分配函数属性使其“无法访问”

我有一个简单的小装饰器,它将函数调用的结果缓存dict为函数属性。

我现在想添加清空缓存的可能性。所以我改变了dynamic_programming()这样的功能:

现在假设我用这个小东西来实现一个斐波那契数函数:

但是现在当我清除缓存时,会发生一些奇怪的事情:

或者(运行一个新的 Python 内核)反过来做:

为什么缓存在第一次访问后以某种方式无法“访问”,即在调用clear()后调用或调用后不改变clear()

(顺便说一句。我知道正确清除缓存的解决方案:调用f.cache.clear()而不是分配{}给它按预期工作。我只是对分配解决方案失败的原因感兴趣。)

0 投票
2 回答
223 浏览

c# - Is it possible to have a make a generic method which can take the place of three methods with a System.Data.Linq.Mapping.FunctionAttribute?

I have three methods in my datacontext class which all call slightly different stored procedures having different behaviours; APPEND, UPDATE, OVERWRITE. However all three methods have in essence the same code. The only difference is the "Name" property of the System.Data.Linq.Mapping.FunctionAttribute which decorates the methods.

[Function(Name = "import.usp_MyData_ProcessImportAppend", IsComposable = false)]

or

[Function(Name = "import.usp_MyData_ProcessImportUpdate", IsComposable = false)]

or

[Function(Name = "import.usp_MyData_ProcessImportOverwrite", IsComposable = false)]

In essence they all look similar to this

Is there any way I can write a generic method where the function name to map to is passed in? Thank you.

UPDATE So based upon the excellent solutions by Ron and Alex, I now have

called in decorated function like...

0 投票
3 回答
261 浏览

c++ - std::thread (c++11) 中使用的函数可以有 [[noreturn]] 吗?

因为std::thread t(foo);,拥有一个 有意义foo [[noreturn]] () {...}吗?例如。对于分离的线程(在应用程序完成之前用作一种守护进程)?

0 投票
3 回答
285 浏览

javascript - 创建函数的函数属性,该函数又是对象字面量的方法

众所周知,在 JS 中,您可以在函数内部创建函数,如下所示:

我不知道这是否是一种不好的做法(可能是)——因为它工作正常,你可以使用它。

但是如果我们有一个digit()函数作为某个对象的方法(见下面的例子)呢?
那么我们将如何声明digit.five()呢?假设我们想在obj.

是否有可能不创建新obj.digitFive()方法?


PS:这里的用户nnnnnn ,我们可以在里面创建一个属性: obj.digit()

这是唯一的方法吗?

0 投票
1 回答
1608 浏览

c++ - GCC - 将宏用于函数属性时出现“具有初始化程序但类型不完整”错误

我有一些头文件,其中包含一些简单的美化structs,其中仅定义了纯虚拟方法。代码在带有 Visual Studio 2015 的 Windows 上编译良好,但 GCC 卡住了。首先,代码:

代码清单



在导入的头文件中,interface仅定义为stuct

而且API_ABSTRACT只是一个没有任何意义的宏:

interface typedef是我无法控制的继承代码的一部分,并且API_ABSTRACT已经到位,因此我可以在 Windows 和 Linux 中定义自定义属性以限制我导出的 API 函数。虽然这是在 VS2015 中构建的,但在 Linux 上,我收到了构建错误:



如果我换行:

我认为它正在被翻译成:

该代码将在 Linux 中正常编译。我尝试过编译以gcc -E -dD将“预处理”后的源渲染到屏幕上以查看typedef#define替换,但它似乎只显示.cpp文件的输出,而不是头文件(.h)。

问题

为什么在尝试使用 GCC 编译时这段代码不起作用?

谢谢你。


编辑#1


的输出gcc -E显示有问题的行是:

因此,罪魁祸首似乎是API_ABSTRACT宏,它的评估结果为零。

0 投票
0 回答
81 浏览

python - Python scipy.optimize.f_min_l_bfgs_b 算法:如何有额外的输出?

我正在使用 Scipy 包中的 L-BFGS-B 优化器。这是 文档。

我的代码具有以下结构。obj_func 是用于最小化“a”的目标函数。为此,obj_func 应该只返回“a”。

问题:有没有办法从 obj_func 中获取“b”和“c”?

目前我正在使用函数属性。但我不确定这是首选方式。

0 投票
2 回答
4259 浏览

python - 在模块中初始化变量的最佳方法?

假设我需要将传入数据写入云上的数据集。何时、何地以及是否需要代码中的数据集,取决于传入的数据。我只想获得对数据集的一次引用。实现这一目标的最佳方法是什么?

  1. 在启动时初始化为全局变量并通过全局变量访问

    /li>

这似乎是最简单的方法,但即使从不需要它也会初始化变量。

  1. 第一次需要数据集时获取引用,保存在全局变量中,并使用get_dataset()方法访问

    /li>
  2. 首次需要数据集时获取引用,保存为函数属性,通过get_dataset()方法访问

    /li>
  3. 任何其他方式