在部分代码中关闭优化
turning optimisation off in part of code
我开始使用 vmprotect sdk 来保护我的应用程序,但我遇到了一些问题,最大的问题是编译器优化 - 它优化了我的标记,看看一个例子:
void *CaptureInterface( char *pszInterfaceName )
{
VMProtectBeginMutation( "capture_interface" );
void* ptr = 12345;
...
...
...
VMProtectEnd( );
return ptr;
}
我尝试了各种组合,VMProtectEnd 在返回之前,之后,但编译器不断优化 VMProtectEnd 函数,因此调用在反汇编中不可见,因此标记开始不配对,我无法保护我的应用程序。有没有办法将优化相关的东西变成 1 或 2 个功能?或者有没有其他方法可以告诉编译器不要碰那个标记,而是继续优化其他标记?
您正在寻找#pragma optimize
预处理器指令。
例如,请参阅 https://msdn.microsoft.com/en-us/library/chh3fb0k.aspx
无论如何,
这些东西都没有多大帮助,我个人担心,如果他们不能正确处理这样一个基本的事情,他们还会对你的代码做什么,调试起来真的很有趣。
但无论如何,如果你想避免他们优化代码,我可能会做一些内联汇编来调用:
static void foo() {
}
void test() {
std::cout << "Hello Worldn";
foo();
std::cout << "Goodbye worldn";
}
void test2() {
std::cout << "Hello Worldn";
__asm {
call foo;
}
std::cout << "Goodbye worldn";
}
test2 中对 foo 的调用在 VS2015 中未使用/O2 进行优化。不过,这仅限于 x86 代码,因为据我所知,Microsoft不再支持 x64 的内联汇编。
如果对函数的调用不仅仅是对运行时的提示,而是调用本身很重要,则可以使用函数指针以可移植的方式实现此目的。我对使用过的图书馆的内部了解不够,不知道是否是这种情况。
相关文章:
- 如何优化代码以返回最接近给定整数的数字,但给定列表中不存在?
- 需要消除这些"else if"并优化代码
- C/C++编译器是否会通过重用最近计算的函数结果来优化代码?
- 如何优化C 代码的以下片段 - 卷中的零交叉点
- C++按字符串调用函数,比较PHP的性能,如何在C++中优化代码
- 优化c++代码以添加两个作为字符串的数字
- x86 汇编和优化代码中的 for 循环
- 如何在gcc中设置模板功能的自动优化代码
- 优化代码/实现"for"循环而不是长"if - else if - else"
- 我的粒子群优化代码在 C++ 和 MATLAB 中生成不同的答案
- 优化代码以获取给定范围内可被整数整除的整数数
- if条件下两个字符串比较的优化代码
- Cuda Thrust - 如何使用sort_by_key、merge_by_key和reduce_by_key优化代码
- 如何优化代码中的参数
- 针对大量迭代优化代码
- 编译器在程序集中优化代码时会做什么?即O2标志
- 优化代码(康威的生命游戏)
- 用于 TSP 的 3 选项优化代码
- 如何使用 SSE 或 GLSL 优化"u[0]*v[0] + u[2]*v[2]"代码行
- 是否有任何情况将对象标记为 const 会导致更好的优化代码(使用优化编译时)