C 为什么';编译器仅在布尔不等式中使用时是否优化增量?

C 为什么';编译器仅在布尔不等式中使用时是否优化增量?,c,compiler-optimization,C,Compiler Optimization,我正在编写一个简单的for循环,检查数组中是否有偶数和奇数 我想弄明白的是,为什么增加一个局部变量作为布尔值使用并没有得到优化,而且每次循环它都会增加 我已将计数限制为uint8,而计数器为uint32,因此没有溢出的机会 导栓连杆: 组装输出可以在godbolt链接中看到,但是粘贴在这里的C代码很容易看到 第一个循环只是将值设置为true和false #include <stddef.h> #include <stdbool.h> #include <stdint

我正在编写一个简单的for循环,检查数组中是否有偶数和奇数

我想弄明白的是,为什么增加一个局部变量作为布尔值使用并没有得到优化,而且每次循环它都会增加

我已将计数限制为uint8,而计数器为uint32,因此没有溢出的机会

导栓连杆:

组装输出可以在godbolt链接中看到,但是粘贴在这里的C代码很容易看到

第一个循环只是将值设置为true和false

#include <stddef.h>
#include <stdbool.h>
#include <stdint.h> 

bool hasEvenAndOdd(int* values, uint8_t count) {

    uint32_t even = 0;
    uint32_t odd = 0;
    for (uint8_t i = 0; i < count; i++) {
        if (values[i] % 2 == 1) {
            odd = 1;
        } else {
            even = 1;
        }
    }

    return (even && odd);
}
#包括
#包括
#包括
布尔值为偶数和奇数(整数*值,单位8_t计数){
uint32_t偶数=0;
uint32_t奇数=0;
对于(uint8_t i=0;i
带计数器的第二个循环:

#include <stddef.h>
#include <stdbool.h>
#include <stdint.h>

bool hasEvenAndOdd(int* values, uint8_t count) {

    uint32_t even = 0;
    uint32_t odd = 0;
    for (uint8_t i = 0; i < count; i++) {
        if (values[i] % 2 == 1) {
            odd++;
        } else {
            even++;
        }
    }

    return (even && odd);
}
#包括
#包括
#包括
布尔值为偶数和奇数(整数*值,单位8_t计数){
uint32_t偶数=0;
uint32_t奇数=0;
对于(uint8_t i=0;i
我想我的问题是,编译器是否可以使用计数器仅用作布尔值的信息来优化所有不需要的增量,而只执行单个增量


谢谢

可能是因为第一个循环毫无意义,而编译器可以通过将“true”和“stop循环”都设置为“true”来解决这个问题。第二个循环做了一些实际的工作,需要更多的代码来完成。谢谢你的评论Serge!对于第一个循环,数组可能有所有奇数、所有偶数或根本没有值,因此不能将这两个值都设置为
true
。我觉得在语义上,它们都在做完全相同的事情。它是否会改变任何东西以使标志签名(这样它们就不会因其他原因溢出)?嗨,David,我尝试使标志int32_t,而程序集输出似乎没有改变。表面上看,这似乎是一个遗漏的优化,虽然我们不应该假设较长的程序集转换为较长的运行时