gpt4 book ai didi

c - C 是否为函数开始时 undefined variable 分配内存?

转载 作者:行者123 更新时间:2023-11-30 20:09:23 25 4
gpt4 key购买 nike

这是我提出这个问题的场景:

static ProfileUnit* g_units_header;
static ProfileUnit* g_units_tail;
static int g_units_count;

void Destroy() {
if (!g_units_header) {
return;
}

typedef std::vector<ProfileUnit*> PUVect;
PUVect stack(g_units_count);
ProfileUnit* p = g_units_header;
while (p) {
stack.push_back(p);
p = p->next;
}
for (PUVect::const_iterator it = stack.begin(); it != stack.end(); ++it) {
free(*it);
}

g_units_header = g_units_tail = nullptr;
g_units_count = 0;
}

如果“g_units_header”为 nullptr,“stack”和“p”是否会在调用堆栈上?这不是一个很好的例子,我只是想解释一下这个场景。只关注问题。

最佳答案

(为了便于说明,我将在问题的原始版本中使用代码的轻微变化。此后您编辑了问题以更改代码,但这不会改变答案。)

实际上,答案取决于所使用的编译器和优化选项。一些可能的结果:

  1. val完全优化掉,无论 p 的值如何.
  2. val被放置在寄存器中(这算作“内存”吗?)
  3. val无论 p 的值如何,都会被放入堆栈中.
  4. val仅当 p 时才放入堆栈不是NULL .

在我的机器上,gcc -O3 #4:

$ cat test.c
#include <stdio.h>

void foo(int* p) {
if (!p) return;
int val = 0xdeadbeef;
scanf("%d", &val);
}

编译:

$ gcc -S -O3 test.c

输出(为简洁而编辑):

$ cat test.s
_foo: ## @foo
testq %rdi, %rdi ## <<< p == NULL?
je LBB0_2 ## <<< Will jump over the stack allocation below
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp ## <<< Allocate stack for val
movl $-559038737, -4(%rbp) ## 0xdeadbeef
leaq L_.str(%rip), %rdi
leaq -4(%rbp), %rsi
xorl %eax, %eax
callq _scanf
addq $16, %rsp ## <<< Deallocate val
popq %rbp
LBB0_2:
retq

关于c - C 是否为函数开始时 undefined variable 分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52658019/

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