[英]Static Values in Assembler Code
我有以下簡單的代碼:
#include <cmath>
struct init_sin
{
typedef double type;
static constexpr type value(int index) {
return 3*std::pow(std::sin(index * 2.0 * 3.1415 / 20.0),1.999);
}
};
int main(){
static double VALUE = init_sin::value(10);
double VALUE_NONSTAT = 3*std::pow(std::sin(10 * 2.0 * 3.1415 / 20.0),1.999);
return int(VALUE_NONSTAT);
}
我想知道匯編代碼的含義是什么。 這里是組件的鏈接: http : //pastebin.com/211AfSYh
我認為VALUE
是計算的編譯時間,並直接作為匯編程序代碼中的值,如果我沒有弄錯的話應該在這一行中:
33 .size main, .-main
34 .data
35 .align 8
36 .type _ZZ4mainE5VALUE, @object
GAS LISTING /tmp/ccbPDNK8.s page 2
37 .size _ZZ4mainE5VALUE, 8
38 _ZZ4mainE5VALUE:
39 0000 15143B78 .long 2017137685
40 0004 45E95B3E .long 1046210885
.long
有兩個值? 為什么這些類型很長? (它是一個雙重?,也許在匯編程序中只有很長時間。 VALUE
是生成的編譯時間 非常感謝!
這個匯編語法中的.long
意味着一個32位的數字。 因為double
是64位,所以你看到的是兩個32位的VALUE
部分,它們的double
表示。 您還會注意到它正在與8字節邊界(通過.align
語句)對齊,並且它的大小為8(通過.size
語句)。 此外,它位於主.data
段中,通常用於未初始化為零的全局范圍變量(作為旁注, .bss
通常用於零初始化的全局范圍變量)。
可以看到VALUE_NONSTAT
被加載到%rax
這里,這是AX
寄存器的64位版本:
V
20 0004 48B81514 movabsq $4493441537811354645, %rax
20 3B7845E9
20 5B3E
回想一下15143B7845E95B3E
是3*std::pow(std::sin(index * 2.0 * 3.1415 / 20.0),1.999)
的值的表示,當存儲在double
,你可以看到以十六進制開始的內部值我插了一個V
稍后語句然后將其推入堆棧( movq %rax, -8(%rbp)
),然后將其加載到FP寄存器( movsd -8(%rbp), %xmm0
),然后將其轉換為整數並將其存儲在%eax
,它是返回值的寄存器( cvttsd2si %xmm0, %eax
),然后使用ret
從例程返回。
在任何情況下,在您正在使用的優化級別(可能在下面),您的編譯器已經發現VALUE_NONSTAT
是一個常量表達式,而只是在編譯時將其內聯,因為該值在編譯時是完全已知的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.