這個問題在這里已經有了答案: g 關閉用于基準測驗的常量傳播? (1 個回答) 了解匯編串列輸出中 GCC 的浮點常量 2 個答案 如何從 GCC/clang 程式集輸出中去除“噪音”? (3 個回答) 昨天關閉。
我插入到這個Godbolt和驚喜,這兩個函式呼叫a(),并b()正在以外的任何等價-O0(使用最為主要的編譯器):
#include <cmath>
struct A {
int a,b,c;
float bar() {
return sqrt(a b c);
}
};
struct B {
int a[3];
float bar() {
int ret{0};
for (int i = 0; i<3; i) {
ret = a[i];
}
return sqrt(ret);
}
};
float a() {
A a{55,67,12};
return a.bar();
}
float b() {
B b{55,67,12};
return b.bar();
}
Godbolt 的輸出是:
a():
movss xmm0, DWORD PTR .LC0[rip]
ret
b():
movss xmm0, DWORD PTR .LC0[rip]
ret
.LC0:
.long 1094268577
我不是裝配專家,但我想知道這是否真的是真的,他們正在做同樣的作業。我什至看不到在這個程式集中哪里有對 a 的呼叫sqrt,或者那個long“常量”(?)在那里做什么。
uj5u.com熱心網友回復:
這個功能:
float a() {
A a{55,67,12};
return a.bar();
}
具有與此完全相同的可觀察行為:
float a() {
return sqrt(55 67 12);
}
對于 也是如此b()。此外,sqrt(55 67 12) == sqrt(134) == 11.5758369028。
IEEE-754 浮點值的二進制表示11.5758369028是01000001001110010011011010100001. 而作為整數的二進制是1094268577.
編譯器應用所謂的if 規則,用與原始代碼具有完全相同的可觀察行為的程式集替換這兩個函式:兩個函式都回傳 afloat和 value 11.5758369028。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/326206.html
上一篇:如何在C#中呼叫x64匯編程式
下一篇:試圖理解堆疊幀x86-64的內容
