This is a relationship between optimization levels. None: No optimization. [-O0] With this setting, the compiler aims to reduce the cost of compilation and debugging to produce the expected results. Statements are independent: If you stop the program with a breakpoint between statements, then you can assign a new value to any variable or any other statement that changes the program counter in the function and get the results you expect from the source code. 1 (Fast): Optimization compilation takes more time, and more memory for large functions. [-0, -1] With this setting, the compiler tries to reduce code size and execution time, without performing any optimizations that require a lot of compile time. In the compiler, strict aliasing, barrier reordering, and inline scheduling optimizations are disabled by default. 2 (Faster): The compiler performs almost all supported optimizations that do not involve space-speed trade-offs. [2] With this setting, the compiler does not perform loop unrolling or inlining of functions, or register renaming. Compared to the "Fast" setting, this setting increases compilation time and the performance of the generated code. 3 (Fastest): Turns on the optimization settings specified by "Faster", and also depends on the function inlining and register renaming options. This setting may result in a larger binary. Fastest [3], the smallest optimization size. This setting allows all "Faster" optimizations without generally increasing code size. It also aims to reduce the code size for further optimizations. Hope it helps.