51 c variables memory-management constants globals
我想知道常量变量存储在哪里.它与全局变量在同一个内存区域吗?还是在堆栈上?
Rob*_*vey 40
它们的存储方式是一个实现细节(取决于编译器).
例如,在GCC编译器中,在大多数机器上,只读变量,常量和跳转表都放在文本部分中.
wra*_*erm 33
根据特定处理器遵循的数据分段,我们有五个部分:
请注意,数据和BSS段之间的区别在于前者存储初始化的全局变量和静态变量,后者存储未初始化的变量.
现在,当我必须告诉存储常量变量的位置时,为什么我要讨论数据分段...这是有原因的......
每个段都有一个写保护区域,其中存储了所有常量.
例如:
总而言之,"const"只是一个数据QUALIFIER,这意味着首先编译器必须决定变量必须存储哪个段,然后如果变量是const,那么它有资格存储在写保护区域中.那个特定的部分.
Jon*_*ler 12
考虑一下代码:
const int i = 0;
static const int k = 99;
int function(void)
{
const int j = 37;
totherfunc(&j);
totherfunc(&i);
//totherfunc(&k);
return(j+3);
}
Run Code Online (Sandbox Code Playgroud)
通常,i
可以存储在文本段中(它是具有固定值的只读变量).如果它不在文本段中,它将存储在全局变量旁边.鉴于它被初始化为零,它可能位于'bss'部分(通常分配归零变量)或'data'部分(通常分配初始化变量).
如果编译器确信它k
是未使用的(可能是因为它是单个文件的本地文件),它可能根本不会出现在目标代码中.如果对该totherfunc()
引用的调用k
没有被注释掉,则k
必须在某处分配一个地址 - 它可能与它在同一段中i
.
常量(如果它是常量,它仍然是变量吗?)j
很可能出现在传统C实现的堆栈上.(如果你在comp.std.c新闻组中询问,有人会提到标准没有说自动变量出现在堆栈上;幸运的是,SO不是comp.std.c!)
请注意,我强制显示变量,因为我通过引用传递它们 - 可能是一个期望指向常量整数的函数.如果从未采取的地址,然后j
和k
可以出代码的完全优化.要删除i
,编译器必须知道整个程序的所有源代码 - 它可以在其他翻译单元(源文件)中访问,因此不能轻易删除.如果程序沉迷于共享库的动态加载,那么其中一个库可能依赖于该全局变量.
(文体-变量i
和j
应具备更长,更有意义的名称,这只是一个例子!)