memcpy
関数呼び出しを置き換える別の方法が見つかりました。それはGCCでしか動作しません(私はまだVC++のために別の方法を見つける必要があります)が、それは原油よりもはるかに良いと思います#define
。それは__REDIRECT
マクロ(はfeatures.h
に含まれています)を使用しています。これはglibcで広く使用されています。以下は、小さなテストでの例を次に示します。
// modified.h
#pragma once
#ifndef MODIF_H_INCLUDED_
#define MODIF_H_INCLUDED_
#include <cstddef>
#include <features.h>
extern "C"
{
void test_memcpy(void* __restrict to, const void* __restrict from, size_t size);
}
#if defined(__GNUC__)
void __REDIRECT(memcpy, (void* __restrict to, const void* __restrict from, size_t size),
test_memcpy);
#endif /* __GNUC__ */
#endif /* MODIF_H_INCLUDED_ */
//modified.cpp
extern "C" void test_memcpy(void* __restrict to, const void* __restrict from,
size_t size)
{
std::cout << "Dumb memcpy replacement!\n";
}
//original.h
#pragma once
#ifndef ORIG_H_INCLUDED_
#define ORIG_H_INCLUDED_
void test_with_orig();
#endif /* ORIG_H_INCLUDED_ */
//original.cpp
#include <cstring>
#include <iostream>
void test_with_orig()
{
int* testDest = new int[10];
int* testSrc = new int[10];
for (unsigned int i = 0; i < 10; ++i)
{
testSrc[i] = i;
}
memcpy(testDest, testSrc, 10 * sizeof(int));
for (unsigned int i = 0; i < 10; ++i)
{
std::cout << std::hex << "\nAfter standard memcpy - "
<< "Source: " << testSrc[i] << "\tDest: " << testDest[i] << "\n";
}
}
// and a small test
#include "modified.h"
#include "original.h"
#include <iostream>
#include <cstring>
int main()
{
int* testDest = new int[10];
int* testSrc = new int[10];
for (unsigned int i = 0; i < 10; ++i)
{
testSrc[i] = i;
testDest[i] = 0xDEADBEEF;
}
memcpy(testDest, testSrc, 10 * sizeof(int));
for (unsigned int i = 0; i < 10; ++i)
{
std::cout << std::hex << "\nAfter memcpy replacement - "
<< "Source: " << testSrc[i] << "\tDest: " << testDest[i] << "\n";
}
test_with_orig();
return 0;
}
Linuxではあなたは[LD_PRELOAD](http://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick)を使用することができます。好奇心のために、最適化された 'memcpy'は何をしますか? –
あなたはより良いmemcpyをしましたか?うわー!もしそれが 'memcpy'と同等(同じプロトタイプ、同じ振る舞い)であれば、私は' #define'を使う上で何の問題も見ません。MSは 'malloc'と' free'のデバッグバージョンでも同じことをします – xanatos
@Kerrebしかし、しばしば 'memcpy'はインライン展開されます。彼は関数のインライン展開を無効にする必要があります。 – xanatos