C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么常量存储在C存储器映射中的文本段中?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
您好请虑下面的代码片段在 Linux机器(64位)上用gcc编译,并带有相应的内存映射

#include <stdio.h>

int global = 2;

int main(void)
{
    int local = 0;

    return 0;
}

text       data     bss     dec     hex filename

1092        500      16    1608     648 mem

这里因为有一个全局变量初始化为2.它已存储在数据段中
虑将其设为const如下所示的情况

#include <stdio.h>

int const global = 2;

int main(void)
{
    int local = 0;

    return 0;
}

text       data     bss     dec     hex filename
1096        496      16    1608     648 mem

这里全局变量从数据段移动到文本段.

为什么它从数据移到文本段?

由于数据段分为读写区域,它应该存储在数据的读取区域中吗?

代码中间初始化的未初始化的全局变量会发生什么?

解决方法

在现代系统中,常量位于为只读数据保留的目标文件的一部分中.该部分在认模式下通过size命令与“text”(程序代码)部分混为一谈,但您可以使它为您提供更多详细信息:

$size test.o  # compiled from the code in the question
   text    data     bss     dec     hex filename
     58       0       0      58      3a test.o

$size -A test.o
test.o  :
section           size   addr
.text                6      0
.data                0      0
.bss                 0      0
.rodata              4      0
.comment            29      0
.note.GNU-stack      0      0
.eh_frame           48      0
@R_549_10586@l               87

看看第一个命令产生的“文本”号是如何由第二个问题产生的.text,.rodata和.eh_frame数字的总和?

您可以使用objdump命令告诉常量是.rodata而不是.text:

$objdump -t test.o | grep -w global
0000000000000000 g     O .rodata    0000000000000004 global

(‘g’表示全局,’O’表示’Object’而不是’F’表示Function.)

大佬总结

以上是大佬教程为你收集整理的为什么常量存储在C存储器映射中的文本段中?全部内容,希望文章能够帮你解决为什么常量存储在C存储器映射中的文本段中?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。