在函数结尾处添加N个字节数以进行热修补

时间:2013-03-06 21:14:05

标签: c++ performance if-statement hotpatching

是否可以在函数末尾添加N个字节数?

我的简单想法是添加以下代码:

_asm {
    NOP
    NOP
    NOP
    NOP
    NOP
}

还有其他方法吗? (使用代码,编译器或其他方法)

我需要它来进行hotpatching功能。我有一个具有一些IF语句的函数,该函数每秒调用10次或更多次。因此,为了提高性能,我需要做更少的检查,例如“我是否需要执行该代码?”。 IF语句中的布尔值不经常更改(我很少说)。我也希望实现这一点,如果我不需要执行某些代码,我不需要检查它。

4 个答案:

答案 0 :(得分:1)

一般情况下,是的,虽然您需要在汇编中编写函数来执行此操作。

另一方面,看起来你正在做的是微优化代码而不是对其进行基准测试。 C ++中的BOOL和条件非常非常快,并且在现代系统上修补操作码的成本可能会导致真正令人惊讶的糟糕性能损失(例如,调用VirtualProtect使代码可写成本将比成本高出数十万单个条件,即使您在嵌入式系统上运行,也可以通过更改内联函数来强制管道停顿和缓存未命中。)

总而言之,是的,你正在做的事情是可能的。但除非你这样做是出于“兴趣”练习或者在一个非常奇怪的环境中运行,其中条件的性能非常重要但是你仍然用C语言编写,那么你可能只想对代码进行基准测试并找到真实的地方它的速度很慢,而不是付出巨大的痛苦和努力来修补那些实际上并不是性能关键的东西。

答案 1 :(得分:1)

您可以使用单点返回编写函数,并在return语句之前添加NOP。虽然这取决于平台。

另一种方法是在return语句之前放置垃圾代码,并使用标签和goto跳转垃圾代码。

请注意可能删除未使用代码的编译器和链接器优化。

答案 2 :(得分:0)

MSVC具有编译器选项/hotpatch,它允许链接器选项/functionpadmin修改最终二进制文件的处理,使得热修补应该对有效函数起作用。您可以指定允许进行热修补的保留字节数。有关详细信息,请参阅链接。

答案 3 :(得分:0)

  

该函数每秒调用10次或更多次。所以,为了提高性能

你的功能需要50-100毫秒的时间才能完成吗?我的意思是,这里真的存在一个性能问题吗?对于简单和常规函数来说,每秒10次都不算什么,但对于一些计算密集型的东西来说可能很多。

强制编译器没有通用的方法来保留一些空间。您可能能够为特定的编译器找到一种特殊的方法,但更好的方法是拥有相同代码的多个版本或在运行时动态构建代码。