c++ - 嵌入式编程中宏值之间的比较是否不好?

标签 c++ c performance macros embedded

我正在构建一个需要在 ARM 上运行的程序。 处理器有足够的资源来运行程序,所以这个问题与这种类型的处理器没有直接关系,而是与非强大的处理器有关,资源和计算能力是“有限的”。

为了打印调试信息(甚至激活部分代码),我使用了一个头文件,我在其中定义了设置为 true 或 false 的宏,如下所示:

#define DEBUG_ADCS_OBC true

在主程序中:

if (DEBUG_ADCS_OBC == true) {
    printf("O2A ");
    for (j = 0; j < 50; j++) {
        printf("%x ", buffer_obc[jj]);
    }
}

这是坏习惯吗?有没有更好的方法来做到这一点?

此外,进行这些 IF 检查是否会以可衡量的方式影响性能?

或者假设在编译代码时 IF 以某种方式从流程中删除是否安全,因为比较是在两个不能更改的值之间进行的?

最佳答案

由于表达式 DEBUG_ADCS_OBC == true 可以在编译时求值,优化编译器将确定分支总是被采用或总是被绕过,并完全消除该条件。因此,当您使用优化的编译器时,表达式的运行时成本为零。

如果您在关闭所有优化的情况下进行编译,请改用条件编译。这将执行优化编译器对常量表达式执行的相同操作,但在预处理器阶段。因此,即使关闭优化,编译器也不会“看到”条件。

注意1:由于DEBUG_ADCS_OBC有 bool 变量的含义,所以使用DEBUG_ADCS_OBC而不用== true更简洁的外观。

注意 2:与其在程序主体中定义值,不如考虑在命令行上传递一个值,例如 -DDEBUG_ADCS_OBC=true。这使您无需修改​​源代码即可更改调试设置,只需操作 make 文件或其选项之一即可。

关于c++ - 嵌入式编程中宏值之间的比较是否不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27425562/

相关文章:

c++ - 是否可以从 .h 文件生成 dlsym 命令?

c++ - sscanf 可能溢出

c++ - 在 32 位平台上编译 OpenSSL 1.1.1g。 MSYS2 - 失败

mysql - 博客系统中的数据库设计

c++ - 我怎样才能修复我的嵌套代码循环通过 ASCII 表放在一起?

c++ - 使用概念的模板类方法特化

c++ - _popen 结果为字符串 : a special case

c - 从 C 文件中读取逗号分隔的数字

使用子选择与值列表的 MySQL IN 子句

MySQL 查询性能 - 查询/模式/索引?