【问题标题】:Change a currently non used class implementation at runtime在运行时更改当前未使用的类实现
【发布时间】:2023-03-07 07:23:02
【问题描述】:

我有一个 C++ 代码正在一个大文件(~15 GB)上执行。代码有两个阶段,第一阶段需要很长时间才能完成。但与此同时,我在其第 2 阶段获得了更好的实现技术,并且不想从头开始重新启动整个执行。这两个阶段按实际使用的两个类进行分类。从中汲取灵感:

Parser.parse(filePath);    // phase one
Processor.processAndLog(); // phase two

那么,有什么方法可以在处理器类开始执行之前改变它的实现吗?阶段 1 的结束(或者甚至它已经完成了多少)可以与我打印的一些不时的消息(比如日志)区分开来。

【问题讨论】:

  • 如果有的话,不推荐
  • 如果您提及它们会很有帮助。
  • 二进制修改可执行文件以拦截错误的调用并调用别的东西。

标签: c++ visual-c++ visual-studio-2008 runtime


【解决方案1】:

如果Processor.processAndLog 是一个成员函数指针,那么您可以在调用它之前随时更改它。

另一种方法是让 Processor.processAndLog 成为其他函数的包装函数 - 调度函数。

还有挂钩函数的问题。有一个名为detours 的库。仅当您无法更改程序的源代码时才使用此选项。

【讨论】:

    【解决方案2】:

    所以,如果我理解正确的话:您有一个程序正在运行,但尚未执行特定类中的代码。并且您想找到一种方法来更新它,以便在不停止程序的情况下为该类使用新版本的代码。

    理论上可以做到。但在实践中,它的麻烦可能远远超过它的价值,特别是如果这是一次性的需求。 C++ 不是为这种事情而设计的。进程的内存中并没有简单的人类可读的源代码可以很容易地被覆盖。

    正确地做到这一点几乎肯定需要大量的时间和精力,很可能涉及大量的实验和反复试验。如果您对它有任何误解(这可能是第一次),那么您可能只是破坏了您的流程和结果,因此无论如何都需要重新启动它。

    我不知道您的流程目前需要多长时间,但尝试弄清楚如何实现这个想法可能比仅仅在构建新版本的程序后重新启动流程需要更多时间。

    【讨论】:

      猜你喜欢
      • 2015-01-15
      • 2019-04-18
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多