C / C ++ - 覆盖默认函数

时间:2010-09-27 20:18:26

标签: c++ c visual-studio-2008 malloc

我有以下问题:

Microsoft Visual Studio (我使用的是2008 SP1)是否提供了覆盖标准C函数的任何方法,例如mallocmemcpy

假设我有一些外部构建的库,其中包含malloc.objmemcpy.obj。 库名为library.lib

我应该如何构建我的项目,以便编译器使用我的(覆盖)版本的malloc()memcpy()例程而不是那些提供的(我假设它们共享相同的语法)

整个问题的关键在于更改项目中的每个malloc而不使用my_malloc或类似的名称别名,以便我可以比较性能。

这可能吗?

谢谢。

4 个答案:

答案 0 :(得分:8)

是否可以更改构建和链接流程,以便替换memcpymalloc的实现?是。这是个好主意吗?不是真的。

最好只使用#define逻辑将这些功能重命名为memcpy_testingmalloc_testing,然后在#define之间切换一个#ifdef testing # define my_malloc(n) testing_malloc(n) #else # define my_malloc(n) malloc(n) #endif 二。这样你的解决方案就可以更容易地移植到其他构建系统,并且对于其他程序员来说,你正在做的事情就更清楚了。

编辑: 与评论一致,以下是您在共享头文件中执行的操作的示例:

void *(__cdecl *my_malloc)(size_t);
// ...
void SetToTest() { my_malloc = testing_malloc; }
void SetToStandard() { my_malloc = malloc; }

如果需要使用函数指针,甚至支持运行时切换:

{{1}}

答案 1 :(得分:1)

没试过,但是 - 在项目属性中 - >链接器 - >输入,将“忽略所有默认库”设置为“是”。然后设置'Additional Dependencies'= library.lib; libcmt.lib。

这应该包括您的库在标准静态CRT之前。提供的功能联动是相同的,每个应该做你想要的。虽然malloc / free如何链接到两个静态库中的OS可能会有问题。我假设library.lib还重新定义了realloc / free / calloc等?

答案 2 :(得分:1)

您可以从源代码中构建自己版本的Visual C ++ C运行时库(CRT),其中包含memcpymalloc函数(以及其他函数),这些函数通常可以在{{1 }}。然后将您的程序与自定义CRT链接。

或者,您可以使用this官方文章中的技巧来挂钩分配函数。

答案 3 :(得分:0)

看看NedMalloc的实现,它是一个自定义分配器NedMalloc,看起来他只是使用#define nedmalloc malloc

头文件说它应该适用于Windows。

hoard它的开源也有囤积,所以你可以看看它们是如何做到的。

C ++也存在问题。如果windows包含将new运算符定义为仅使用下面的malloc,那么一切都适用于您的自定义分配器。否则你必须覆盖6个运算符来分配和删除C ++方式。