我有以下简单的代码:
#includestruct 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
生成的编译时间的值
VALUE_NON_STATIC的结果在哪里?这应该在运行时计算吗?我不太清楚在哪里?
非常感谢!
.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
回想一下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
是一个常量表达式,而只是在编译时将其内联,因为该值在编译时是完全已知的.