Пожалуйста, рассмотрите следующую программу:
int main() {
int test = 17;
return test;
}
Компилировать в LLVM_IR: clang++ -S -emit-llvm test.cpp
Глядя на ИК, функция main определяется следующим образом:
; Function Attrs: noinline norecurse nounwind optnone uwtable
define dso_local i32 @main() #0 {
%1 = alloca i32, align 4
%2 = alloca i32, align 4
store i32 0, i32* %1, align 4
store i32 17, i32* %2, align 4
%3 = load i32, i32* %2, align 4
ret i32 %3
}
Мы можем видеть, что %2
- это распределение нашей test
переменной, загружая в нее 17
, и %3
использует эту переменную в качестве возвращаемого значения функции (в соответствии с кодом, в котором мы ее написали),Однако мы видим, что %1
определяет другую переменную размером int
и инициализирует ее значением 0, несмотря на то, что никогда не использует ее.Эту дополнительную переменную нигде не видно в исходном коде C ++.
Следует отметить, что я вижу, что то же самое генерируется при компиляции с использованием clang
вместо clang++
.
Что такоеэта дополнительная переменная?