How to use VC++ intrinsic functions w/o run-time library
- by Adrian McCarthy
I'm involved in one of those challenges where you try to produce the smallest possible binary, so I'm building my program without the C or C++ run-time libraries (RTL). I don't link to the DLL version or the static version. I don't even #include the header files. I have this working fine.
For some code constructs, the compiler generates calls to memset(). For example:
struct MyStruct {
int foo;
int bar;
};
MyStruct blah = {}; // calls memset()
Since I don't include the RTL, this results in a missing symbol at link time. I've been getting around this by avoiding those constructs. For the given example, I'll explicitly initialize the struct.
MyStruct blah;
blah.foo = 0;
blah.bar = 0;
But memset() can be useful, so I tried adding my own implementation. It works fine in Debug builds, even for those places where the compiler generates an implicit call to memset(). But in Release builds, I get an error saying that I cannot define an intrinsic function. You see, in Release builds, intrinsic functions are enabled, and memset() is an intrinsic.
I would love to use the intrinsic for memset() in my release builds, since it's probably inlined and smaller and faster than my implementation. But I seem to be a in catch-22. If I don't define memset(), the linker complains that it's undefined. If I do define it, the compiler complains that I cannot define an intrinsic function.
I've tried adding #pragma intrinsic(memset) with and without declarations of memset, but no luck.
Does anyone know the right combination of definition, declaration, #pragma, and compiler and linker flags to get an intrinsic function without pulling in RTL overhead?
Visual Studio 2008, x86, Windows XP+.