0

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

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

_asm {
    NOP
    NOP
    NOP
    NOP
    NOP
}

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

我需要它来热补丁功能。我有一个有一些 IF 语句的函数,该函数每秒被调用 10 次或更频繁。所以,为了提高性能,我需要少做一些检查,比如“我需要执行那个代码吗?”。IF 语句中的布尔值不会经常更改(我会说很少)。我也想实现,如果我不需要执行一些代码,我不需要检查。

4

4 回答 4

1

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

于 2013-03-06T21:19:10.977 回答
1

一般来说,是的,尽管您需要在汇编中编写函数才能这样做。

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

所以总而言之,是的,你正在做的事情是可能的。但是除非您将其作为“出于兴趣”的练习或在非常奇怪的环境中运行,条件的性能至关重要但您仍然使用 C 编写,否则您可能只想对代码进行基准测试并找到真正的地方它很慢,而不是付出巨大的痛苦和努力来修补实际上对性能并不重要的东西。

于 2013-03-06T21:23:33.733 回答
1

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

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

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

于 2013-03-06T22:05:34.733 回答
0

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

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

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

于 2013-03-06T21:24:11.560 回答