The Build tab of the Project Properties in Visual Studio 2005/2008 contains the "Optimize code".
The documentation states that it "... enables or disables optimizations performed by the compiler to make your output file smaller, faster, and more efficient."
- My question is why should I NOT have it on?
- Why is it not on by default?
- What does it actually do?
Wikipedia has an article on compiler optimization that covers many of the basic types of optimizations.
You don't want to create optimized debug builds. Optimization affects the debugabbility of your code - some lines of code may be removed, some lines of code from different parts of a function or from different functions may be merged together, local variables may be folded together, and so on. This means when debugging your current line can appear to jump around randomly due to the code being reorganized and inspecting local variables can be very misleading - the space for a local might be reused when it is no longer needed and appear to give a jibberish result.
Have a look at the answers to What is /optimize C# compiler key intended for? They answer your questions (especially Noldorin's answer).