问题标签 [constantfolding]
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.
python-2.7 - 编译 python 源代码而不进行常量折叠优化
我有一个python片段如下
将其编译为 AST 给出:
请注意,在生成的 AST6 * 8
中没有优化为 48。
但是,如果我编译这个生成的 AST 并反汇编,6 * 8
则替换为48
.
我的问题
如何在没有常量折叠优化的情况下将代码编译为字节码?我需要这样做来开发一个混淆器。
c++ - C++ 常量折叠素数循环
看过前面的问题1、2后,我想知道是否可以强制编译器对以下打印素数的代码执行常量折叠。
我通过以下方式构建它:
结果有几个:
我想强制编译器查看类似于
或者
但是阅读程序集表明没有发生任何事情。
我什至用过__builtin_expect
,但没有用。
有没有办法强制编译器优化器读取for循环并利用输出数据已知的优势?
我想在不使用模板元编程的情况下做到这一点。
PS。 我的真正目的只是测试编译器,而不是计算素数的有效方法。我只是想向我的朋友炫耀 C++ 编译器有多么强大。
如果分离is_prime
是关注的问题,我将所有内容都放在 main 中并且没有观察到差异:
甚至还有一个示例仍然不能为编译器提供任何借口:
部件:
c++ - 编译器对屏蔽类没有常量折叠
对于嵌入式项目,我使用辅助类作为标志和掩码。由于未知原因,掩码类的代码未按预期正确折叠。
掩码的最小实现如下所示:
该类的使用如以下示例所示:
代码使用 GCC 4.8.3 编译,带有选项-Os
. 我希望,编译器会将此代码解析为单个值,但它实际上会创建一个函数来根据这些值计算掩码。
我的代码中是否有特殊原因阻止了正确的 const 折叠?
c - Preprocessor constant folding
I have a fundamental question regarding the C preprocessor constant evaluation and I would like some help in understanding if the preprocessor helps in optimizing the code in a situation like this. I understand that the preprocessor merely "replaces text" in the code. By that rule, even constant expressions get replaced in the code. For instance, the below code:
The value of a
comes to 7. This is because the preprocessed code looks something like this:
I can see that MY_NUM
did not evaluate to 6 before the compilation kicks in. Of course the compiler then optimizes the code by evaluating the value of a
at compile time.
I am not sure if preprocessor constant folding happens or not or if it is even possible. Or is there any way (flag in gcc) to enable it. The regular -O
optimizations do not enable this. Is there anyway we could change the behavior of the preprocessor here?
I am using gcc 4.8.4 for my code.
c++ - 有没有办法在 C++17 中折叠初始化列表
有没有办法做初始化列表折叠而不是使用参数包?我的问题是我有一个重载的构造函数,我想根据我是否使用来调用不同的构造函数{}
。这似乎与初始化列表一起工作得很好,当我使用它时,它设法隐藏我的另一个参数构造函数{}
,而不是当我只用 构造它时()
,但如果我使用不隐藏我的另一个参数构造函数的参数包,它会失败.
另外,我看到人们在他们的折叠表达式中附加了 void,当我提到 cppreference 时我无法理解,它似乎对我的程序也没有任何影响。
编辑:根据要求,举例说明问题:
注意注释掉的部分,我希望能够做这样的事情,以便在编译时计算出已知大小参数列表的填写过程,而不是我使用 for 循环。应该为第一个 cout 打印一些垃圾值,为第二个 cout 打印 2(至少在 MSVC2017 中是这样,不知道这种隐藏机制是否符合标准)。请注意,如果将define 设置为true,则可以使用参数包ctor,但即使使用{}
语法,它也无法隐藏一个参数ctor。
Edit2:为了最大的方便,进一步更新了代码,只需将定义更改为 true 以查看参数包无法使用{}
语法隐藏 1 和 2 参数构造函数,而初始化列表 ctor 设法隐藏。
链接:使用初始化列表: http ://coliru.stacked-crooked.com/a/7b876e1dfbb18d73 输出:
使用参数包: http ://coliru.stacked-crooked.com/a/11042b2fc45b5259 输出:
python - 常量折叠的具体规则是什么?
我刚刚意识到 CPython 似乎对待表示相同值的常量表达式,在常量折叠方面有所不同。例如:
对于第二个示例,应用了常量折叠,而对于第一个示例,尽管两者都表示相同的值,但它不是。它似乎与指数的值或结果的大小无关,因为以下表达式也被折叠:
为什么前两个表达式的处理方式不同,更一般地说,CPython 对常量折叠遵循的具体规则是什么?
测试:
c# - 以恒定可折叠的方式反序列化 JSON Map C#
我需要将 <string,string> 映射的字符串表示形式传递到我的 U-SQL 程序中,并将其反序列化为 C# Dictionary<string,string>,以便我可以将其转换为 U-SQL SqlMap。我需要以一种恒定可折叠的方式来完成它。我最近的尝试:
因“E_CSC_USER_EXPRESSIONNOTCONSTANTFOLDABLE:表达式不能被常量折叠”而失败。
我已经找到了许多将字符串反序列化为映射的方法,但到目前为止还没有一种方法是恒定可折叠的。我找不到常量可折叠 c# 表达式的列表,这在这里也很有帮助。
java - Java 语言规范 Java SE 11 版 (JLS SE 11) 中对常量折叠的描述在哪里?
据我所知,Java 通过在编译时进行常量折叠来处理常量变量§4.12.4。我已经尽力了,但我无法从 JLS 中找到它的描述。谁能告诉我在哪里可以找到Java 11的常量折叠过程的官方描述?
c++ - 禁用 LLVM 10 C++ API 的常量折叠
我正在使用 LLVM C++ API 为 C 语言的子集编写编译器前端。我注意到生成的 IR 始终应用了恒定折叠优化。但我想禁用它并获得一个忠实的、未优化的 IR。有没有办法做到这一点?
以下是我使用模块生成 IR 的代码。
似乎我使用的 LLVM 版本是 LLVM 10。
例如,当我在以下 C 函数上运行编译器时
它被编译为
常量的二元运算由编译器自己评估,即常量折叠;它没有被翻译成适当的 IR 代码。