如何在VS2013中使用内联版本的memcpy?

时间:2017-11-09 05:02:12

标签: c++ c visual-studio inline

我知道这听起来很奇怪,但我不想在我的程序的IAT中看到 MSVCR120.dll 。在新计算机上运行程序时,这总是很糟糕,因为他们没有安装此dll。

经过一些谷歌搜索后,我发现#pragma intrinsic(memcpy)似乎是为我的问题设计的,但实际上

这是一个用于演示的小代码:

#pragma intrinsic(memcpy)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <windows.h>

void main(int argc,char **argv)
{
    // simple cat implementation
    if (argc>1)
    {
        FILE *f = fopen(argv[1], "rb");
        fseek(f, 0, SEEK_END);
        DWORD size = ftell(f);
        fseek(f, 0, SEEK_SET);
        char *buf = (char*)malloc(size);
        fread_s(buf, size, 1, size, f);
        // below is nonsense , but for demonstration
        char *buf2 = new char[size+1];
        memcpy(buf2, buf, size); // this memcpy is **NOT** inlined!
        puts(buf2);
    }
}

是的,我知道在ntdll中实现了一个memcpy函数,我可以通过GetProcAddress使用它,但现在我想测试#pragma intrinsic(memcpy) NOT 的工作原因。

上面的代码会生成以下内容:

Assembly

这个memcpy实际上是在msvcr120.dll中调用真实memcpy函数的包装器。

wrapper

其IAT中有一个memcpy:

IAT

我很确定我已经在我的编译器选项中启用了内部函数:

option

有解决方案吗?感谢。

编辑:我注意到几乎所有版本的Windows都存在 msvcrt.dll 。那么有没有可以链接msvcrt.dll而不是msvcr120.dll的选项?

1 个答案:

答案 0 :(得分:-1)

还有其他选择。如何将您自己的memcpy功能实现为

void memcpy(void *dest, void *src, unsigned int length)
{
   unsigned char * destination = (unsigned char*)dest;
   for (int len = 0; len < length; len++)
          destination[len] = ((unsigned char*)src)[len];
}