During compilation, C/C++ compilers store variable information in symbol tables, which help in memory allocation and scope resolution. How do modern compilers like GCC, Clang, and MSVC handle variables at different stages of compilation (parsing, semantic analysis, optimization, and code generation)?