编译器优化合并相同的函数实现意味着在运行时绕行的存根

时间:2012-11-23 02:48:39

标签: c++ compiler-optimization detours

我有一个C ++测试项目,其中包含一堆具有相同实现的存根函数。这些存根应在运行时使用Windows Detours进行“替换”。问题在于,在发布模式下,编译器会将所有这些存根指向同一个实现。为了说明这一点,请考虑以下代码:

#include <iostream>
using namespace std;

void A() { cout << "stub" << endl; }
void B() { cout << "stub" << endl; }

void main()
{
    cout << &A << ", " << &B << endl;
}

在调试模式下,指针值将不同。在发布模式下,它们是相同的。 我尝试了pragma optimize指令(我正在使用Microsoft编译器),但它没有解决问题。结果,我的Windows Detours钩子拦截了对相同存根的所有调用。

我该如何解决这个问题? 感谢。

1 个答案:

答案 0 :(得分:1)

尝试使用预处理器宏使存根函数唯一,这样优化器就不会将它们合并为一个。

__FILE__, __LINE__, and __FUNCTION__ usage in C++

这样的事情:

void A() { cout << __FUNCTION__ << endl; }
void B() { cout << __FUNCTION__ << endl; }