Compiler Optimization Level
কম্পাইলার অপ্টিমাইজেশন লেভেল
-O0 থেকে -O3 — কম্পাইলার কতগুলো optimization pass চালাবে তার পূর্বনির্ধারিত সংকলন। -O0 আক্ষরিক, প্রতিটা variable স্ট্যাকে, debugging-friendly; -O2 register-ভিত্তিক, দ্রুত, কিন্তু debugger-এ বিভ্রান্তিকর।
also: -O0, -O1, -O2, -O3, optimization level, -Og, -Os
| Flag | দর্শন | Debug করা |
|---|---|---|
-O0 | কোনো optimization না — ডিফল্ট | সবচেয়ে সহজ |
-Og | debugging-friendly optimization | তুলনামূলক সহজ |
-O2 | প্রায় সব “নিরাপদ” optimization | কঠিন |
-O3 | -O2 + loop unrolling, auto-vectorization | কঠিনতর |
-Os | code size-এর জন্য optimize | কঠিন |
-O0-এ প্রতিটা local variable-এর একটা fixed stack slot
(register allocation pass বন্ধ), প্রতিটা source statement আলাদা,
verbose instruction-block-এ — debugger-এ breakpoint/step করলে
সবসময় predictable মান দেখায়।
; sum_array, -O0 ; sum_array, -O2
movl -8(%rbp), %eax addl (%rdi,%rax,4), %ecx
cltq addq $1, %rax
leaq 0(,%rax,4), %rdx cmpq %rax, %rdx
movq -24(%rbp), %rax jne .L3
addq %rdx, %rax
movl (%rax), %eax
addl %eax, -4(%rbp)
-O2-এ variable যতক্ষণ সম্ভব register-এ, memory access
minimized, load+ALU প্রায়ই এক instruction-এ fuse হয় (addl (mem), %reg), branch মাঝে মাঝে cmov-এ elide হয়। কিন্তু frame pointer
উধাও হতে পারে, instruction সোর্স-লাইনের সাথে ১-এ-১ না মিলতে পারে।
Undefined behavior optimization-কে বিপজ্জনক করে — কম্পাইলার
UB নেই ধরে নেয়; UB থাকলে -O0-এ “কাজ করা” কোড -O2-এ ভিন্ন
ফলাফল দিতে পারে। এটা optimizer-এর বাগ না, সোর্সের বাগ।
GCC-তে loop vectorization (-ftree-vectorize) -O3-এর অংশ,
-O2-এর না — Clang-এ নিয়ম আলাদা।