变量名如何存储在 C 中?
How is a variable name stored in C?
想问一下C中的变量是如何存储在C中的?
为了更清楚,请考虑以下代码:
int main() {
int a = 1, b;
b = a + 2;
return 0;
}
比如这里在什么内存中C存储变量名的地方。
例如,如果 &a=0x12A7
(假设)&b=0x123B1
,那么 c 如何以及在哪里存储变量名称,例如存储名称 a
的存储位置?
变量名根本不需要存储!编译器可以完全摆脱它们。想象一下,如果编译器相当聪明,它可以将你的整个程序缩减为:
int main(){
return 0;
}
注意这个程序的效果和你原来的一模一样,现在完全没有变量!现在不用点名了吧?
即使实际使用了代码中的变量,它们的名称也纯粹是您编写程序时方便的符号,但处理器在执行您的代码时不需要它们。就微处理器而言,像这样的函数:
int foo(int x, int y) {
int z = x + y;
return z * 2;
}
在某些假设的简单指令集架构 (ISA) 中,可能会产生执行此操作的编译代码:
ADD # consumes top two values on stack (x and y), pushes result (z)
PUSH 2 # pushes 2 on stack
MULT # consumes top two values on stack (z and 2), pushes result
RET
长话短说,有时存储变量名是为了调试目的。例如,如果您使用的是 GCC,则可以传递 -g
选项来发出一个 "symbol table",其中包含用于调试的变量名称之类的内容。但是 运行 一个程序并不需要它,而且它不在语言标准中——它是一个因平台而异的实现功能。
C 不存储变量名。它的编译器将变量名称存储在编译器的 符号 table.
中
此数据结构由编译器创建和维护。
代码段
的符号 table 的 example
// Declare an external function
extern double bar(double x);
// Define a public function
double foo(int count)
{
double sum = 0.0;
// Sum all the values bar(1) to bar(count)
for (int i = 1; i <= count; i++)
sum += bar((double) i);
return sum;
}
可能至少包含以下符号:
好的,如果您刚开始接触 C,那么首先从这里开始:
http://condor.cc.ku.edu/~grobe/intro-to-C.shtml
但这比你的问题更实际。要回答这个问题,我们首先要问为什么变量有地址。这里的原因是堆栈。对于运行 return 的程序,必须将调用定向到适当的缓冲区,以便所有部分都按设计组合在一起。现在我认为是最初的问题,即实际地址是如何确定的,要回答这个问题,您必须了解处理器是如何实现堆的。
https://en.wikipedia.org/wiki/Memory_management
"Since the precise location of the allocation is not known in advance, the memory is accessed indirectly, usually through a pointer reference. The specific algorithm used to organize the memory area and allocate and deallocate chunks is interlinked with the kernel..."
这让我们回到了抽象指针的实际方面:
https://en.wikipedia.org/wiki/C_dynamic_memory_allocation
希望这能让您更清楚地了解引擎盖下的内容:)
编码愉快。
想问一下C中的变量是如何存储在C中的?
为了更清楚,请考虑以下代码:
int main() {
int a = 1, b;
b = a + 2;
return 0;
}
比如这里在什么内存中C存储变量名的地方。
例如,如果 &a=0x12A7
(假设)&b=0x123B1
,那么 c 如何以及在哪里存储变量名称,例如存储名称 a
的存储位置?
变量名根本不需要存储!编译器可以完全摆脱它们。想象一下,如果编译器相当聪明,它可以将你的整个程序缩减为:
int main(){
return 0;
}
注意这个程序的效果和你原来的一模一样,现在完全没有变量!现在不用点名了吧?
即使实际使用了代码中的变量,它们的名称也纯粹是您编写程序时方便的符号,但处理器在执行您的代码时不需要它们。就微处理器而言,像这样的函数:
int foo(int x, int y) {
int z = x + y;
return z * 2;
}
在某些假设的简单指令集架构 (ISA) 中,可能会产生执行此操作的编译代码:
ADD # consumes top two values on stack (x and y), pushes result (z)
PUSH 2 # pushes 2 on stack
MULT # consumes top two values on stack (z and 2), pushes result
RET
长话短说,有时存储变量名是为了调试目的。例如,如果您使用的是 GCC,则可以传递 -g
选项来发出一个 "symbol table",其中包含用于调试的变量名称之类的内容。但是 运行 一个程序并不需要它,而且它不在语言标准中——它是一个因平台而异的实现功能。
C 不存储变量名。它的编译器将变量名称存储在编译器的 符号 table.
中
此数据结构由编译器创建和维护。
代码段
// Declare an external function
extern double bar(double x);
// Define a public function
double foo(int count)
{
double sum = 0.0;
// Sum all the values bar(1) to bar(count)
for (int i = 1; i <= count; i++)
sum += bar((double) i);
return sum;
}
可能至少包含以下符号:
好的,如果您刚开始接触 C,那么首先从这里开始: http://condor.cc.ku.edu/~grobe/intro-to-C.shtml
但这比你的问题更实际。要回答这个问题,我们首先要问为什么变量有地址。这里的原因是堆栈。对于运行 return 的程序,必须将调用定向到适当的缓冲区,以便所有部分都按设计组合在一起。现在我认为是最初的问题,即实际地址是如何确定的,要回答这个问题,您必须了解处理器是如何实现堆的。
https://en.wikipedia.org/wiki/Memory_management
"Since the precise location of the allocation is not known in advance, the memory is accessed indirectly, usually through a pointer reference. The specific algorithm used to organize the memory area and allocate and deallocate chunks is interlinked with the kernel..."
这让我们回到了抽象指针的实际方面:
https://en.wikipedia.org/wiki/C_dynamic_memory_allocation
希望这能让您更清楚地了解引擎盖下的内容:)
编码愉快。