打印
[LKS32 软件]

为啥编译器优化调到0就可以运行

[复制链接]
楼主: EmmaTT
手机看帖
扫描二维码
随时随地手机跟帖
21
usysm| | 2024-8-6 13:35 | 只看该作者 回帖奖励 |倒序浏览
在O0优化等级下,编译器关闭了大多数的优化措施,生成的目标代码与编写的源代码几乎一一对应。这种设置保证了高度的代码一致性,使得开发者能够直接根据源代码快速定位到任何编译后的位置,极大地方便了调试过程。

使用特权

评论回复
22
fengm| | 2024-8-6 15:15 | 只看该作者
O0级别下的编译时间通常是最短的,这对于需要快速编译和测试的场景非常有用。

使用特权

评论回复
23
elsaflower| | 2024-8-6 16:53 | 只看该作者
即使没有优化,编译器仍然会执行基本的代码翻译工作,将高级语言的源代码转换成机器能够理解的二进制代码。这个过程足以保证程序的基本功能得以实现。

使用特权

评论回复
24
macpherson| | 2024-8-6 18:28 | 只看该作者
在调试过程中,开发人员可能希望看到尽可能接近源代码的机器代码,以便更容易地追踪和理解程序的行为。

使用特权

评论回复
25
mattlincoln| | 2024-8-6 20:07 | 只看该作者
当遇到因编译器优化而产生的bug时,降低优化等级至O0是最直接的解决方法。这种做法可以直接禁用或降低优化,从而解决因优化引起的问题,而不需要深入到编译器输出的目标平台汇编代码层面进行分析和处理。

使用特权

评论回复
26
wengh2016| | 2024-8-6 21:51 | 只看该作者
高级优化有时可能导致程序行为与预期不符。这可能是由于编译器优化时对代码进行了错误的假设或者优化过程中引入了新的错误。将优化级别设置为0可以避免这些问题。

使用特权

评论回复
27
MYWX| | 2024-8-7 09:49 | 只看该作者
当程序在优化级别为0时可以正常运行,但提高优化级**出现问题,这通常是因为编译器在更高级的优化设置下,可能会改变程序的某些行为,尤其是在以下方面:

代码重排:优化可能会改变代码的执行顺序,这在某些情况下可能导致问题,尤其是当代码依赖于特定的执行顺序时。

内联函数:优化级别提高时,编译器可能会内联更多的函数,这可能会改变程序的控制流和数据访问模式。

死代码消除:某些在优化级别较低时可能被保留的代码,在更高级别下可能会被优化掉,这可能会影响程序的行为。

浮点运算精度:优化可能会改变浮点运算的精度,导致不同的结果。

内存访问模式:优化可能会改变内存访问模式,例如通过重新排列数组或结构体的成员来提高缓存效率。

错误优化:在某些情况下,编译器的优化可能会引入错误,尤其是在处理复杂的边界条件或依赖特定硬件特性的代码时。

使用特权

评论回复
28
albertaabbot| | 2024-8-8 11:41 | 只看该作者
如果某个优化选项导致了问题,分析为什么会出现这种情况,并尝试改进代码以适应该优化选项。这可能需要进行代码重构、使用更高效的算法或数据结构等。

使用特权

评论回复
29
kkzz| | 2024-8-8 13:25 | 只看该作者
在开发过程中,关闭优化选项有助于调试和测试。因为在优化过程中,编译器可能会对代码进行一些难以预测的改动,这可能会影响调试和测试的准确性。关闭优化选项可以确保代码的可读性和可调试性。

使用特权

评论回复
30
eefas| | 2024-8-8 15:05 | 只看该作者
编译器不会改变程序的逻辑或行为,因此即使没有优化,程序仍然可以按照预期的方式运行。

使用特权

评论回复
31
robertesth| | 2024-8-8 16:39 | 只看该作者
由于O0级别保留了源代码的原始结构,它对于调试非常有用。开发者可以在不改变代码逻辑的情况下,更容易地定位和解决问题。

使用特权

评论回复
32
ccook11| | 2024-8-8 21:21 | 只看该作者
在某些情况下,程序可能依赖于特定的处理器指令集。高级优化可能会导致编译器生成不兼容的指令,从而导致程序无法运行。优化级别为0可以确保生成的代码与特定的指令集保持一致。

使用特权

评论回复
33
earlmax| | 2024-8-9 00:24 | 只看该作者
将编译器优化级别设置为0,然后重新编译程序。这样可以确保编译器不会对代码进行任何优化,从而帮助你找到问题的根源。

使用特权

评论回复
34
robincotton| | 2024-8-9 03:30 | 只看该作者
不同的优化等级(如O0、O1、O2、O3)对应于不同的优化强度和目标,影响着编译后程序的行为和性能。

使用特权

评论回复
35
plsbackup| | 2024-8-9 06:36 | 只看该作者
大多数编译器都提供了多个优化级别,从0到3或更高。优化级别越高,编译器采取的优化措施越激进,通常会生成更快的机器代码,但编译时间可能更长,且有时可能会引入编译错误或不可预见的行为。

使用特权

评论回复
36
uiint| | 2024-8-10 10:43 | 只看该作者
O1等级会移除死代码和未使用的变量,而O2等级及以上则会进行更复杂的优化操作,如循环展开和自动内联等。

使用特权

评论回复
37
benjaminka| | 2024-8-10 12:27 | 只看该作者
在O0等级下,由于没有进行这些优化,因此可以避免这些问题,使程序能够稳定运行。

使用特权

评论回复
38
AutoMotor| | 2024-8-16 08:37 | 只看该作者
表示代码有缺陷,但是优化后有问题。

使用特权

评论回复
39
单片小菜| | 2024-9-2 11:12 | 只看该作者
很多代码写得不严谨,不规范造成的,所以记得将代码写的规范一些。

使用特权

评论回复
40
V853| | 2024-9-2 13:12 | 只看该作者
在o0级别,由于没有进行这些优化,所以可以避免这些问题,程序可以稳定运行。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则