【问题标题】:In which segment global const variable will stored and why全局 const 变量将存储在哪个段中以及为什么
【发布时间】:2014-07-19 21:01:41
【问题描述】:

在将const 限定符应用于任何全局变量后会增加文本段的大小。 那么,为什么全局 const 变量会存储在文本段中。

我试过这些代码

const int i = 5;
int main()
{
        return 0;
}

命令输出:size a.out

文本数据 bss dec 十六进制文件名
1080 496 16 1592 638 a.out

int i = 5;
int main()
{
        return 0;
}

命令输出:size a.out

文本数据 bss dec 十六进制文件名
1076 500 16 1592 638 a.out


【问题讨论】:

  • 它存储在文本段中,因为文本段是只读的(不可写),因此将变量放在那里会强制执行常量。无论放置在何处,这对您来说都不是问题。
  • 但是 const 限定符意味着通过其他方式进行更改......那么将其存储在文本中的意义何在
  • 阙?你在想volatile吗? const 表示“无法更改”。
  • 是的,关键字const 不会将变量转换为常量!带有const 限定符的符号仅表示该符号不能用于赋值。这使得值只能通过该符号读取; .所以它将放入文本段(只读)。
  • 我们可以通过使用指针来改变 const 变量的值......所以如果它将存储在文本段中,那么它将如何改变??

标签: c constants


【解决方案1】:

由于文本段是只读的,它可以在运行程序的所有进程之间共享,从而潜在地减少内存消耗。这对于可能被许多程序使用的共享库来说更为重要。这是否是实际发生的情况取决于您的操作系统的行为。

将带有静态存储的 const 变量放在文本段中可确保尽可能多地利用这种机制。

【讨论】:

  • 但是 const 限定符意味着通过其他方式改变......那么将它存储在文本中的意义是什么......我们不能改变它的值
  • 不,不,不,不。 const 表示这不会改变。有一些方法可以避免这种情况,因为在某些情况下可能需要它们,但不能保证它们会起作用。
  • 你可以跳下一座桥并不意味着你应该,也不是任何人的错,而是你自己的错。
  • 通过声明一个变量const,你告诉编译器你不打算改变它。如果您对编译器撒谎,请准备好面对后果。
  • 我不明白你............在嵌入式系统中,const 变量只能这样使用......所以这些变量的值可以通过硬件端口、其他线程或通过其他方式。
【解决方案2】:

编译器有更好的机会使用const 变量进行优化。在这里,const 值似乎已合并到代码中,因此文本段的大小增加了。

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2019-05-27
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多