gpt4 book ai didi

arrays - 从程序集的角度看地址运算符和数组

转载 作者:太空宇宙 更新时间:2023-11-04 05:48:53 25 4
gpt4 key购买 nike

下面的代码获取var1的地址,然后把它放到p

int var1;
int *p;
p = &var1;

Q1: 是不是说 CPU 为 var1 的地址创建了一个空间(由于地址运算符),然后把它给了 p


除了第一个代码创建了一个变量 p 来存储 A 的地址之外,下面的两个代码都做同样的事情。

首先:

int A[3]= {2, 4, 6};

int *p = A;

printf("%d\n", p);
printf("%d\n", *p);

第二个:

int A[3]= {2, 4, 6};

printf("%d\n", A);
printf("%d\n", *A);

问题 2:在第二个问题中,编译器是否为同一目的 secret 创建了一个变量?还是不用变量就可以做到?

谢谢

最佳答案

CPU 不会“创建变量”。您可以说编译器 通过选择它使用的指令在堆栈上为变量创建空间,或者在静态存储中使用汇编程序指令在 .data 中保留空间,.rodata.bss 部分。

如果将该代码放在 http://godbolt.org/ 上,您或多或少会看到您所期望的结果。禁用优化 (-O0),即 x86、ARM 或其他任何东西的实际 asm 将为存在于 C 抽象机中的每个变量保留空间,并实际将值存储在那里。

但是在正常编译的实际代码中(-O2-O3),编译器利用了“as if”规则,它可以发出任何 asm 指令decides 将产生与 C 源代码相同的可观察行为,包括完全优化 int *p 并执行与 printf("%d\n", 2); 等效的操作.不过,将地址 A 传递给 printf 之类的外部函数可能会导致编译器实际在堆栈上创建该数组。但是你永远不会获取 p 本身的地址,所以 p 没有理由存在于内存中。

关于arrays - 从程序集的角度看地址运算符和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49890211/

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