编程语言中的常量折叠(const folding)

来源:互联网 发布:linux修改字符集为gbk 编辑:程序博客网 时间:2024/05/16 12:49

深度学习框架theano的文档中说,theano支持const folding。在google上搜索const folding,提示更多的是一种编译器的编译优化技术。常量折叠(const folding)的本质仅仅是一种编译器所提供的编译优化技术。

考虑这样一段代码:

for (int i = 0; i < 200*800*700; ++i){    // 循环体}

该循环的条件(i<200*700*800)是一个表达式(expression),如果放到判断时再求值那么200*700*800的计算将会进行112000000次。如果编译器在语法分析阶段进行常量合并,该循环将会变为这样:

for (int i = 0; i < 112000000; ++i){    // 循环体}

我们再来看一次没那么直观的例子,本质仍然针对常量进行的常量折叠:

const int i = 0;int* pi = const_cast<int*>(&i);            // const_cast消除常量性*pi = 5;cout << "&i = " << &i << ", pi = " << pi << std::endl;cout << "i = " << i << ", *pi = " << *pi << std::endl;

诡异的事情发生了:

&i = 001EF788, pi = 001EF788i = 0, *pi = 5

可见这里的常量(被const修饰)i的值被放入常量表中,输出时输出的是常量表中对应的值。而在运行阶段,它在内存里存的实体也确确实实改变了,但这并未影响常量表对中对应的值。

0 0