[英]C/C++ - overriding default functions
我有以下问题:
Microsoft Visual Studio (我使用的是2008 SP1)是否提供了覆盖标准C函数的任何方法,例如malloc
, memcpy
?
假设我有一些外部构建的库,其中包含malloc.obj
和memcpy.obj
。 库名为library.lib
。
我应该如何构建我的项目,以便编译器使用我的(重写)版本的malloc()
和memcpy()
例程而不是那些提供的(我假设它们共享相同的语法) ?
整个这个问题的关键在于改变我的项目中的每个malloc
而不使用像my_malloc
或类似的名称别名,这样我就可以比较性能。
这可能吗?
谢谢。
是否可以更改构建和链接过程,以便替换memcpy
和malloc
的实现? 是。 这是个好主意吗? 并不是的。
你最好只使用#define
逻辑将这些函数重命名为memcpy_testing
和malloc_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)版本,其中包含memcpy
和malloc
函数(以及其他函数),这些函数通常可以在\\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.