Я участвую в одной из тех задач, когда вы пытаетесь создать наименьший возможный двоичный файл, поэтому я создаю свою программу без библиотек времени выполнения C или C ++ (RTL). Я не ссылаюсь на версию DLL или статическую версию. Я даже не #include
файлы заголовков. У меня это работает нормально.
Некоторые функции RTL, такие как memset()
, могут быть полезны, поэтому я попытался добавить свою собственную реализацию. Он отлично работает в сборках отладки (даже для тех мест, где компилятор генерирует неявный вызов memset()
). Но в выпусках Release я получаю сообщение о том, что не могу определить встроенную функцию. Видите ли, в выпусках Release встроенные функции включены, а memset()
является встроенным.
Я бы хотел использовать встроенную функцию для memset()
в моих сборках релиза, поскольку она, вероятно, встроенная, меньше и быстрее, чем моя реализация. Но я, кажется, в улове-22. Если я не определяю memset()
, компоновщик жалуется, что он не определен. Если я определю это, компилятор пожалуется, что не могу определить встроенную функцию.
Кто-нибудь знает правильную комбинацию определений, объявлений, #pragma
, а также флагов компилятора и компоновщика, чтобы получить встроенную функцию без дополнительных затрат RTL?
Visual Studio 2008, x86, Windows XP +.
Чтобы сделать задачу немного более конкретной:
extern "C" void * __cdecl memset(void *, int, size_t);
#ifdef IMPLEMENT_MEMSET
void * __cdecl memset(void *pTarget, int value, size_t cbTarget) {
char *p = reinterpret_cast<char *>(pTarget);
while (cbTarget > 0) {
*p++ = static_cast<char>(value);
--cbTarget;
}
return pTarget;
}
#endif
struct MyStruct {
int foo[10];
int bar;
};
int main() {
MyStruct blah;
memset(&blah, 0, sizeof(blah));
return blah.bar;
}
И я строю так:
cl /c /W4 /WX /GL /Ob2 /Oi /Oy /Gs- /GF /Gy intrinsic.cpp
link /SUBSYSTEM:CONSOLE /LTCG /DEBUG /NODEFAULTLIB /ENTRY:main intrinsic.obj
Если я компилирую с моей реализацией memset()
, я получаю ошибку компилятора:
error C2169: 'memset' : intrinsic function, cannot be defined
Если я скомпилирую это без моей реализации memset()
, я получу ошибку компоновщика:
error LNK2001: unresolved external symbol _memset