gpt4 book ai didi

c++ - 汇编代码中的静态值

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:21 25 4
gpt4 key购买 nike

我有以下简单代码:

#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
  1. 为什么 .long 有两个值?为什么类型很长? (它是双?,也许在汇编器中只有 long。
  2. 这是否意味着 VALUE 的值是编译时生成的
  3. VALUE_NON_STATIC 的结果在哪里?这应该在运行时计算,对吗?我不太明白在哪里?

非常感谢!

最佳答案

此汇编程序语法中的

.long 表示 32 位数字。因为 double 是 64 位的,所以您看到的是 VALUE 的两个 32 位部分,在它们的 double 表示中。您还会在其上方注意到它与 8 字节边界对齐(通过 .align 语句)并且它的大小为 8(通过 .size 语句) ).此外,它位于主要的 .data 段中,该段通常用于初始化为零的全局范围变量(作为旁注,。 bss 通常用于零初始化的全局范围变量)。

这里可以看到 VALUE_NONSTAT 被加载到 %rax 中,这是 AX 寄存器的 64 位版本:

             V
20 0004 48B81514 movabsq $4493441537811354645, %rax
20 3B7845E9
20 5B3E

回想一下,15143B7845E95B3E3*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 是一个常量表达式,并且只是在编译时内联它,因为该值在编译时是完全已知的。

关于c++ - 汇编代码中的静态值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20397384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com