问题标签 [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.
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
算术运算,因此操作顺序无关紧要(与float
s 相反)。
我还检查了 asm,但它没有帮助:所有整数似乎都是在编译时预先计算的。
gcc - const gcc 函数属性和全局 const 变量
来自GCC 文档:
许多函数除了参数之外不检查任何值,并且除了返回值之外没有任何效果。基本上,这只是比上面的纯属性稍微严格的类,因为不允许函数读取全局内存。
我的问题是全局const
值是否算作全局内存。我认为确实如此,但是我明确标记为不变的值可能会否定此处可能的优化,这似乎很奇怪。
例如:
根据ConstantModulusValue
我的理解,使用 意味着不应标记此功能,这const
对我来说再次显得很奇怪。const
标记这个我看不到的东西有什么危险吗?
c - GCC 属性对嵌套函数的影响
只能为函数声明(而不是定义)指定函数属性。所以,我不能为嵌套函数指定属性。例如:
在这种情况下,“hot_nested_function”会被优化为“hot”吗?
UPD:在一个愚蠢的例子中,gcc(意味着gcc -O1
和更高的优化级别)用它的主体替换函数调用,无论是有还是没有__attribute__ ((hot))
(对于嵌套函数)。甚至没有任何关于嵌套函数的提醒。
UPD2:根据gcc.git/gcc/tree-nested.c解析父函数引用、外部标签跳转等。在下一阶段,嵌套函数将转换为具有内联能力的独立函数。但目前还不清楚父函数的属性。他们申请嵌套了吗?
python - 重新分配函数属性使其“无法访问”
我有一个简单的小装饰器,它将函数调用的结果缓存dict
为函数属性。
我现在想添加清空缓存的可能性。所以我改变了dynamic_programming()
这样的功能:
现在假设我用这个小东西来实现一个斐波那契数函数:
但是现在当我清除缓存时,会发生一些奇怪的事情:
或者(运行一个新的 Python 内核)反过来做:
为什么缓存在第一次访问后以某种方式无法“访问”,即在调用clear()
后调用或调用后不改变clear()
?
(顺便说一句。我知道正确清除缓存的解决方案:调用f.cache.clear()
而不是分配{}
给它按预期工作。我只是对分配解决方案失败的原因感兴趣。)
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...
c++ - std::thread (c++11) 中使用的函数可以有 [[noreturn]] 吗?
因为std::thread t(foo);
,拥有一个 有意义foo [[noreturn]] () {...}
吗?例如。对于分离的线程(在应用程序完成之前用作一种守护进程)?
c++ - GCC - 将宏用于函数属性时出现“具有初始化程序但类型不完整”错误
我有一些头文件,其中包含一些简单的美化struct
s,其中仅定义了纯虚拟方法。代码在带有 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
宏,它的评估结果为零。
python - Python scipy.optimize.f_min_l_bfgs_b 算法:如何有额外的输出?
我正在使用 Scipy 包中的 L-BFGS-B 优化器。这是 文档。
我的代码具有以下结构。obj_func 是用于最小化“a”的目标函数。为此,obj_func 应该只返回“a”。
问题:有没有办法从 obj_func 中获取“b”和“c”?
目前我正在使用函数属性。但我不确定这是首选方式。
python - 在模块中初始化变量的最佳方法?
假设我需要将传入数据写入云上的数据集。何时、何地以及是否需要代码中的数据集,取决于传入的数据。我只想获得对数据集的一次引用。实现这一目标的最佳方法是什么?
在启动时初始化为全局变量并通过全局变量访问
/li>
这似乎是最简单的方法,但即使从不需要它也会初始化变量。
第一次需要数据集时获取引用,保存在全局变量中,并使用
/li>get_dataset()
方法访问首次需要数据集时获取引用,保存为函数属性,通过
/li>get_dataset()
方法访问任何其他方式