繁体   English   中英

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

[英]C/C++ - overriding default functions

我有以下问题:

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

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

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

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

这可能吗?

谢谢。

是否可以更改构建和链接过程,以便替换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; }

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

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

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

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

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

头文件说它应该在Windows上工作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM