gpt4 book ai didi

c++ - 清除预处理宏

转载 作者:太空狗 更新时间:2023-10-29 20:31:54 25 4
gpt4 key购买 nike

这是一个奇怪的问题,所以我必须提供一些背景知识。我有一个正在处理的 C++ 项目,我想稍微清理一下。我正在处理的让我想吐的主要问题是项目核心组件中使用的预处理器宏的大量滥用。有一个包含一堆 #define 的文件,在编译和使用程序之前注释/取消注释,以便切换不同算法的使用。我宁愿使用命令行参数来执行此操作,而不是每次我们想尝试不同的算法时都重新编译。问题是整个代码中交织着太多的#ifdef,似乎不可能简单地为每个算法重构代码。

有人告诉我,这背后的原因是,这应该是一个处理毫秒时间单位的实时系统,并且这个组件中的代码被调用了很多次,以至于有一个 if 检查会对我们的性能产生不利影响。如果您想尝试另一种算法,则必须设置适当的标志并重新编译,以便优化性能。

所以我的问题是:
<我>
有什么方法可以摆脱这些宏,而是使用命令行参数而不会对性能造成重大影响,并且无需重新编写逻辑和代码?

我正在考虑的选项之一是尝试为每个可能的算法组合编译此组件的版本,然后选择将由提供的命令行参数的组合定义的版本。但是据我 friend 说,组合的数量太多了,不可行。我自己还没有计算出这些数字,但考虑到他为这段代码投入了多少工作,我会相信他的话。

最佳答案

this is supposed to be a real-time system that will be dealing with millisecond units of time

这是一个真正的问题。

[...] that having an if check would adversely affect our performance.

这不是一个好理由。

如果您的代码已经针对性能进行了基准测试并因此进行了优化(本应如此),那将适用。我无法想象在任何情况下,您可以通过将 ifs 替换为 #defines 来获得显着的性能提升(除非 ifs 是比较字符串内容、使用顺序搜索或类似的对性能造成灾难性影响的东西)。

因此我敢打赌,使用宏的决定是在设计时选择的,这可能会导致过早优化(“过早优化是所有宏定义的根源":D)

Is there any way that I can get rid of these macros and instead use command-line arguments without a heavy hit to performance and without reworking the logic and the code?

是的。

以下是一些可能的步骤(还有其他解决方案,但这个解决方案根本不使用 if:

  1. 为您的代码定义基准并运行它(存储结果)

  2. 找到根据不止一种可能的 #define 实现的代码区域。

  3. 将定义移到具有通用接口(interface)的函数后面。

  4. 在运行时,将参数与常量进行比较,并将指向所选函数的指针传递给客户端代码。

    要避免的事情:

    • 不止一次进行比较;比较之后你应该有一个选择的函数指针;应该传递该函数指针,而不是您的参数。
    • 使用字符串(或 char* 或任何非数字的内容)执行比较。比较字符串——或任何不在恒定时间内完成的比较——对于性能关键代码来说是灾难性的。与其使用 if 比较参数值,不如考虑使用 switch 语句。
    • 将大型结构作为参数传递给您的策略函数。传递应该通过 (const) 引用或指针来完成。
  5. 通过函数指针而不是直接调用策略代码。

  6. 重复在第 0 步完成的基准测试并比较性能。

在这一点上,您应该向您的老板/经理展示一个强有力的案例:

  • 您可以使代码运行得尽可能快(将函数调用的成本添加到性能关键代码中应该无关紧要 - 在汇编级别,函数调用应该涉及在堆栈上传递一些指针,并且jmp 指令 - 我认为)。您可以使用基准测试结果证明它运行得一样快。

  • 您的代码将更易于维护(更加模块化、在接口(interface)后面分离功能 block 、集中更改等)

  • 你的代码应该更容易扩展(同上原因)

  • 您不必再重新编译您的代码库。

  • 您解决了一个大问题(由过早优化引起)。

  • 随着其他领域的开发/维护的进行,您可以继续重构代码库(并摆脱更多的宏),而功能行为几乎没有变化。

关于c++ - 清除预处理宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3242768/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com