在函数末尾增加N字节计数用于hotpatch



是否可以在函数结束时添加N个字节计数?

我的简单想法是添加以下代码:
_asm {
    NOP
    NOP
    NOP
    NOP
    NOP
}

还有其他方法吗?(带代码、编译器或其他方法)

我需要它来修补这个功能。我有一个函数,它有一些IF语句,这个函数每秒被调用10次或更频繁。因此,为了提高性能,我需要做更少的检查,比如"我是否需要执行该代码?"IF语句中的布尔值不会经常改变(我想说很少)。如果我不需要执行一些代码,我也想达到这个目的,我不需要检查

您可以使用一个单点返回来编写函数,并在返回语句之前添加nop。尽管这是平台相关的。

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

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

MSVC有编译器选项/hotpatch,它允许链接器选项/functionpadmin修改最终二进制文件的处理,以便hotpatch应该对有效的函数起作用。您可以指定允许热补丁的保留字节数。

一般来说,可以,尽管需要用汇编语言编写函数。

另一方面,看起来你正在做的是微优化你的代码,而不是基准测试。c++中的BOOLs和条件是非常非常快的,在现代系统中修补操作码的成本可能会导致非常非常糟糕的性能损失(例如,调用VirtualProtect使代码可写的成本将比单个条件花费数十万美元,并且即使在嵌入式系统上运行,您也会通过更改内线函数来强制管道中断和缓存丢失)。

总之,是的,你所做的是可能的。但是,除非你这样做是一个"出于兴趣"的练习,或者运行在一个非常奇怪的环境中,条件的性能是至关重要的,但你仍然用C编写,那么你可能只想基准测试你的代码,而不是去寻找真正的慢的地方,而不是花费大量的痛苦和精力去修补那些实际上不是性能关键的东西。

函数每秒被调用10次或更频繁。因此,为了提高性能

你的函数是否需要50-100毫秒的时间来完成?我是说,这真的有完美的问题吗?每秒10次对于简单和常规的函数来说是微不足道的,但是对于一些计算密集型的东西来说可能是很多。

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

最新更新