凡被保存在C常数变量?(Where are constant variables stored in

2019-08-19 01:34发布

我不知道常数变量存储。 它是在相同的存储区域为全局变量? 或者是在栈上?

Answer 1:

它们是如何存储是一个实现细节(依赖于编译器)。

例如,在GCC编译器,在大多数机器上,只读变量,常量和跳转表被放置在文本部分。



Answer 2:

根据一个特定的处理器如下数据分割,我们有五个部分:

  1. 代码段 - 仅存储代码,ROM
  2. BSS(或块由符号开始) 数据段-存储初始化的全局变量和静态变量
  3. 堆栈段 - 存储所有的局部变量和其他信息有关函数的返回地址等
  4. 堆段 - 所有动态分配发生在这里
  5. 数据 BSS(或块由符号开始)段-商店未初始化的全局和静态变量

需要注意的是,数据和BSS段之间的区别在于,前者店初始化的全局和静态变量和未初始化的人后来店。

现在,为什么我讲的时候我一定要告诉只是存储在哪里常数变量...有一个原因给它的数据分割...

每一段都有,所有的常量存储在一个写保护的区域。

例如:

  • 如果我有一个const int的是局部变量,那么它存储在堆栈段的写保护区。
  • 如果我有一个初始化常量VAR一个全球性的,那么它存储在数据段。
  • 如果我有一个未初始化的常量变种,那么它存储在BSS段...

概括地说,“常量”只是一个数据限定,这意味着第一编译器必须决定变量被存储哪些段,然后如果该变量是一个常量,那么它有资格被存储在写保护区该特定部分。



Answer 3:

考虑代码:

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);
}

一般来说, i可以被存储在文本段(它具有固定值的只读变量)。 如果不是在文本段,它会被存储在全局变量旁边。 因为它被初始化为零,它可能是在“BSS”节(零变量通常分配),或在“数据”节(初始化的变量通常分配)。

如果编译器信服k未使用(这可能是因为它是本地的一个文件),它可能不会出现在目标代码在所有。 如果调用totherfunc()引用k没有注释掉,然后k将不得不在某个地方分配的地址-这很可能是在同一段i

常数(如果它是一个常数,它仍然是一个变量?) j很可能会出现一个常规的C语言实现的堆栈。 (如果你的comp.std.c新闻组中询问,有人会提的是,标准不说,自动变量出现在堆栈上;!幸运的是,因此不comp.std.c)

请注意,我强迫的变量出现,因为我按引用传递它们 - 大概是一个函数期待一个指向常整型。 如果从未采取的地址,然后jk可以出代码的完全优化。 要删除i ,编译器必须知道所有整个程序的源代码-这是在其他翻译单元(源文件)访问,所以不那么容易被删除。 双不如果程序沉溺于共享库的动态加载 - 这些库的一个可能依赖于全局变量。

(文体-变量ij应该有较长的,更有意义的名称,这只是一个例子!)



Answer 4:

取决于你的编译器,您的系统功能,同时编译配置。

gcc 看跌期权只读的常量.text部分,除非另有指示。



Answer 5:

offcourse不是,因为

1)bss段存储的非inilized变量它显然另一种类型是存在的。

       (I) large static and global and non constants and non initilaized variables it stored .BSS section.

       (II) second thing small static and global variables and non constants and non initilaized variables stored in .SBSS section this included in .BSS segment.

2)数据段是它有3种类型initlaized变量,

      (I) large static and global and initlaized and non constants variables its stord in .DATA section.
      (II) small static and global and non constant and initilaized variables its stord in .SDATA1 sectiion.
     (III) small static and global and  constant and initilaized OR non initilaized variables its stord in .SDATA2 sectiion.

我在编译提及上述小型和大型装置depents例如小手段<超过8个字节和大型装置>超过8个字节和相等的值。

但我的疑问是局部常量是在那里将Stroe的??????



Answer 6:

通常它们存储在只读数据段(在全局变量部分有写的权限)。 因此,试图修改利用其地址可能会导致访问冲突又名段错误不断。

但是,这取决于你的硬件,操作系统和编译器真的。



Answer 7:

这主要是一个受过教育的猜测,但我想说的是常数通常存储在你的编译程序的实际CPU指令,作为即时数据。 那么也就是说,大部分的操作包括地址获取从数据空间,但如果它是一个常数,空间可容纳本身的价值。



Answer 8:

全球和恒定是两个完全隔开的关键字。 你可以有一个或另一个,没有或两者兼而有之。

当你的变量,那么,存储在内存取决于配置。 阅读上的一个位堆和栈 ,这会给你一些知识提出更多(如果可以的话,更好,更具体的)问题。



Answer 9:

一些常量甚至arfen't存储。

考虑下面的代码: int x = foo(); x *= 2; int x = foo(); x *= 2; 。 机会是,编译器会变成乘法成x = x+x; 作为减少了需要从存储器加载数字2。



Answer 10:

它可能不被存储在所有。

考虑像这样的代码:

#import<math.h>//import PI
double toRadian(int degree){
  return degree*PI*2/360.0;
}

这使得程序员聚集是怎么回事的想法,但是编译器优化掉一些的是,和大多数编译器一样,在编译时评估常量表达式,这意味着该值PI可能无法在结果程序在所有。



Answer 11:

正如一个一个添加的,因为你知道它的链接过程中的内存奠定最终可执行的出决定。还有一个更部分称为通用在从不同的输入文件的常用符号是placed.This常见的部分实际上是下降下.bss段。



Answer 12:

它必须存储在文本段,因为它是只读变量。 http://shirleyanengineer.blogspot.in/2017/05/memory-layout-of-process.html



文章来源: Where are constant variables stored in C?