Gab*_*iel 4 c++ assembly static c++11
我有以下简单的代码:
#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);
}
Run Code Online (Sandbox Code Playgroud)
我想知道汇编代码的含义是什么.这里是程序集的链接: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
Run Code Online (Sandbox Code Playgroud)
.long?为什么这些类型很长?(它是一个双重?,也许在汇编程序中只有很长时间.VALUE生成的编译时间的值非常感谢!
.long在这个汇编语法中意味着一个32位的数字.由于double是64位的,你看到的有两个32位的部分VALUE,在他们的double代表.您还会注意到它正在与8字节边界(通过.align语句)对齐,并且它的大小为8(通过.size语句).此外,它位于主.data段中,通常用于未初始化为零的全局范围变量(作为旁注,.bss通常用于零初始化的全局范围变量).
所述VALUE_NONSTAT可以看出被加载到%rax这里,这是的64位版本的AX寄存器:
V
20 0004 48B81514 movabsq $4493441537811354645, %rax
20 3B7845E9
20 5B3E
Run Code Online (Sandbox Code Playgroud)
回想一下15143B7845E95B3E,3*std::pow(std::sin(index * 2.0 * 3.1415 / 20.0),1.999)当存储在a 中的值的表示时double,你可以看到十六进制内部值从我插入的位置开始V.
稍后语句然后将其推入堆栈(movq %rax, -8(%rbp)),然后将其加载到FP寄存器(movsd -8(%rbp), %xmm0)中,然后将其转换为整数并将其存储在%eax其中,这是返回值(cvttsd2si %xmm0, %eax)的寄存器,然后使用从例程返回ret.
在任何情况下,在您正在使用的优化级别(可能在下面),您的编译器已经发现它VALUE_NONSTAT是一个常量表达式,而只是在编译时将其内联,因为该值在编译时是完全已知的.