【问题标题】:C/C++ - overriding default functionsC/C++ - 覆盖默认函数
【发布时间】:2010-09-27 20:18:26
【问题描述】:

我有以下问题:

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

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

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

整个事情的重点是更改我项目中的每个malloc,而不使用my_malloc 或类似名称的别名,以便我可以比较性能。

这可能吗?

谢谢。

【问题讨论】:

  • 显然,这个问题是可以在此处标记C/C++的问题之一:)
  • 这是一个特定于实现的问题,因此我将您的平台添加到标签中。没有标准的方法可以做到这一点(尽管有标准的方法可以做到这一点),所以它取决于编译器和构建系统。

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


【解决方案1】:

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

最好只使用#define 逻辑将这些函数重命名为memcpy_testingmalloc_testing,然后使用一个#define 在两者之间切换。这样一来,您的解决方案就更易于移植到其他构建系统,并且其他程序员可以更直接地了解您到底在做什么。

编辑: 为了与 cmets 保持一致,以下是您在共享头文件中所做的示例:

#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; }

【讨论】:

  • 我不同意#define malloc(n) my_malloc(n) 会更直接清晰。实际上在代码本身中进行搜索/替换会更清楚。替换为#define 甚至可能很危险:例如,查看代码站点,很难判断它是调用系统实现还是您自己的实现,因此很难判断使用哪个释放器。如果链接仍然使用系统 malloc 的代码(或者如果项目的某些部分忽略使用 #define),则问题会更大。
  • 我认为我的重命名想法和你的想法是相反的:我建议在代码本身中写 my_malloc 以明确表明正在发生一些奇怪的事情,并在标题中写下类似 @987654334 的内容@/#define my_malloc(n) testing_malloc(n)/#else/#define my_malloc(n) malloc(n)/#endif
  • 啊,好吧。是的,我同意这样更好。 (我将“那些函数”解释为“memcpymalloc”,而不是自定义实现。)
  • 对不起-1,但这并不能回答问题。当需要覆盖 CRT 函数时,有很多有用的情况,但编辑源代码是不可能的。我的情况是 MSVC 标准设施不如其他系统(特别是 fopen 不支持 UTF-8 文件名),因此我可以使第 3 方闭源静态库支持 Unicode 文件名的唯一方法是覆盖fopen 他们使用。您的“替代方案”对我没有一点帮助,尽管这正是 OP 所要求的。
【解决方案2】:

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

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

【讨论】:

  • 如果你这样做,那么你将失去那些库实现的所有其他东西,而不仅仅是 malloc!
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    查看作为自定义分配器NedMalloc 的 NedMalloc 的实现,他似乎只是使用#define nedmalloc malloc

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 1970-01-01
      相关资源
      最近更新 更多