常量编译器优化
⑴ 如何防止因编译器开启优化,而导致程序执行错误
我的经验是:未优化的c程序可正常运行,优化后不能运行,那一定是我的程序有问题。我还没经历过不是我程序的情况。
发现这种不易发现的问题,需要看汇编码。
避免的方法,我的经验:写c程序,尽量规矩;似是而非的概念,一定要搞清楚,别侥幸。因为侥幸而留的雷,现在不出问题,将来一定会出问题;不优化不出问题,优化就出问题。
最后要说,每个应用程序,都让他开优化运行,只要时间允许,一定要查出开优化后出问题的原因。时间不允许,只能不开优化凑合着,在有时间的时候继续查问题。
⑵ 编译器是怎么实现32位整型的常量整数除法优化的
int divide(int a, int b) { return a / b; } float divide(float a, float b) { return a / b; }
⑶ 对于一个很复杂的常量表达式,编译器会算出结果再编译吗
这种问题会有几个维度。挑两个来说说:
涉及的常量折叠是否为语言规范所强制要求的。如果是的话,那么符合规范的编译器就一定要做这样的常量折叠。
如果不属于上一条的情况,那么这就是编译器的实现质量的问题。一个编译器可以自由选择是否做常量折叠(或其它常量相关)优化。同一个编译器有可能可以配置在不同的优化层级上工作,或许有些在低优化层级没有被常量折叠的代码,在高优化层级会被优化。
⑷ 怎么指定某段代码不被编译器优化掉
在C语言中, 某些语句,如:
int a;
a = 0;
a = 1;
a =2; 这个可能编译器会把前面两句给优惠掉, 这个如果 前面两句也是必须要执行的, 可以把 int a 改成 volatile int a。
在编译的时候, 编译器可能会预测到某个变量的值, 就把中间的没有必要的语句给优化掉,volatile 关键字就是告诉编译器,不要做这样的预测性优化, 按照文本代码来翻译。
⑸ java中 String s = "aa" + "bb" 创建了几个对象
标准答案 只建立一个对象 !
String s ="aa"+"bb",
在编译时候进行了优化处理。变成 String s ="aabb"; 这个和java 本身没关系。这是编译优化原理,
编译器对常量运算,会进行优化。
分析一下.class 文件就知道了。
如果是这样情况就不一样了!
String s1="aa";
String s2="bb"+s1;
这个创建几个对象呢。真确的是编译后有两个对象会产生:“aa","bb".
运行时又产生对象s2(严格说是个对象的引用)
总结,编译器对,常量运算,会进行编译优化处理。
但对于带有变量的运算。只有运行程序才进行处理!
⑹ 如何在编译java的时候,取消编译器对编译常量的优化
遇到的问题是想重新编译某个java文件(比如A.java),里面有个常量(比如finalinta)和上次编译时不一样,但是另一个使用A.class的a的文件(比如B.java)由于在javac在上次编译的时候将当时的A.class里面的常量直接给内联了,所以就达不到想要的效果。
如果是这样的话,对于String可以使用.intern()来防止编译器进行优化,对于其他类型,可以要么不定义为常量,要么将常量定义为private,然后使用一个static方法来返回这个常量。
⑺ int a[100] 这400个字节的空间编译时并不分配
编译时当然不分配,运行时才分配。
编译把源程序翻译成机器指令:“给a分配100个单元,整型”
执行程序时,操作系统按指令分配,无所谓聪明不聪明。
⑻ 编译器优化怎么定义
常见的优化和变新有:函数内嵌(inlining),无用代码删除(Dead code elimination),标准化循环结构(loop normalization),循环体展开(loop unrolling),循环体合并,分裂(loop fusion,loop fission),数组填充(array padding),等等。 优化和变形的目的是减少代码的长度,提高内存(memory),缓存(cache)的使用率,减少读写磁盘,访问网络数据的频率。更高级的优化甚至可以把序列化的代码(serial code)变成并行运算,多线程的代码(parallelized,multi-threaded code)。
机器代码的生成是优化变型后的中间代码转换成机器指令的过程。现代编译器主要采用生成汇编代码(assembly code)策略,而不直接生成二进制的目标代码(binary object code)。即使在代码生成阶段,高级编译器仍然要做很多分析,优化,变形工作。例如如何分配寄存器(register allocatioin),如何选择合适的机器指令,如何合并几句代码成一句等等。
⑼ 谁能介绍一下代码优化中的常量繁殖constant propagation
连续不断的传送(constant propagation)等。它还赋予优化某些特定于Java技术的性能。如:空-检查(null-check)和值域-检查(range-check)删除等。寄存器分配程序(register allocator)是一个用颜色表示分配程序的全局图形,它充分利用了大的寄存器集(register sets)。Java HotSpot性能引擎的全优化编译器的移植性能很强,它依赖相对较小的机器描述文件来描述目标硬件的各个方面。尽管编译器采用了较慢的JIT标准,但它仍然比传统的优化编译器要快得多。而且,改善的代码质量也是对由于减少已编译代码的执行次数而节省的时间的一种"回报"。