上面看到的
-O1
Optimize. Optimizing compilation takes somewhat more time, and a lot more memory for a large function.
Without -O, the compiler's goal is to reduce the cost of compilation and to make debugging produce the expected
results. Statements are independent: if you stop the program with a breakpoint between statements, you can then assign
a new value to any variable or change the program counter to any other statement in the function and get exactly the
results you would expect from the source code.
With -O, the compiler tries to reduce code size and execution time, without performing any optimizations that take
a great deal of compilation time.
-O2
Optimize even more. GCC performs nearly all supported optimizations that do not involve a space-speed tradeoff. The
compiler does not perform loop unrolling or function inlining when you specify -O2. As compared to -O, this option
increases both compilation time and the performance of the generated code.
-O2 turns on all optional optimizations except for loop unrolling, function inlining, and register renaming. It
also turns on the -fforce-mem option on all machines and frame pointer elimination on machines where doing so does not
interfere with debugging.
Please note the warning under -fgcse about invoking -O2 on programs that use computed gotos.
-O3
Optimize yet more. -O3 turns on all optimizations specified by -O2 and also turns on the -finline-functions and
-frename-registers options.
-O0
Do not optimize.
-Os
Optimize for size. -Os enables all -O2 optimizations that do not typically increase code size. It also performs
further optimizations designed to reduce code size.
If you use multiple -O options, with or without level numbers, the last such option is the one that is effective.
-fomit-frame-pointer
Don't keep the frame pointer in a register for functions that don't need one. This avoids the instructions to save,
set up and restore frame pointers; it also makes an extra register available in many functions. It also makes debugging
impossible on some machines.
On some machines, such as the VAX, this flag has no effect, because the standard calling sequence automatically
handles the frame pointer and nothing is saved by pretending it doesn't exist. The machine-description macro
FRAME_POINTER_REQUIRED controls whether a target machine supports this flag. See Register Usage.