首页 / 知识
静态变量存储在C和C ++中的哪个位置?
2023-04-17 04:16:00
Where are static variables stored in C and C++?可执行文件的哪个段(.bss,.data,other)中存储了静态变量,以便它们不会发生名称冲突?例如:
如果我编译这两个文件并将其链接到一个重复调用footerst()和bartest的main,printf语句将独立递增。有意义,因为foo和bar变量是翻译单元的本地变量。 但是存储在哪里分配呢? 要清楚地说,假设您有一个工具链,可以以elf格式输出文件。因此,我认为在可执行文件中必须为这些静态变量保留一些空间。出于讨论目的,假设我们使用gcc工具链。 静态的位置取决于它们是否初始化为零。零初始化静态数据进入.bss(以符号开头的块),非零初始化数据进入.data 当一个程序装入内存时,它被组织成不同的段。其中一个段是数据段。数据段进一步分为两部分:初始化数据段:所有的全局、静态和常量数据都存储在这里。未初始化数据段(BSS):所有未初始化的数据都存储在此段中。 下面是一个图表来解释这个概念: 以下是解释这些概念的非常好的链接:
实际上,变量是元组(存储、作用域、类型、地址、值):
局部作用域可以是局部到翻译单元(源文件)、函数或块,这取决于其定义的位置。要使变量对多个函数可见,它必须位于数据或BSS区域中(取决于其是否显式初始化)。然后它的作用域相应地限定为源文件中的所有函数或函数。 数据的存储位置取决于实现。 然而,静态的含义是"内部联系"。因此,符号是编译单元(foo.c,bar.c)的内部符号,不能在编译单元之外引用。所以,不会有名称冲突。 我不相信会有碰撞。在文件级使用static(外部函数)将变量标记为当前编译单元(文件)的本地变量。它在当前文件之外永远不可见,因此不必有名称。 在函数内部使用static是不同的-变量只对函数可见,它的值只在调用该函数时保留。 实际上,static根据其所在位置执行两种不同的操作。但是,在其他情况下,它会限制变量的可见性,以防止名称空间冲突, 尽管如此,我相信它将存储在倾向于初始化变量的数据中。BSS最初代表字节集- 如何与EDOCX1[0]一起找到它 要真正了解正在发生的事情,您必须了解链接器重新定位。如果你从未接触过这一点,请考虑先阅读这篇文章。 让我们分析一个Linux x86-64 ELF示例来了解它:
编译:
用以下代码解压代码:
在
因为我们使用的是RIP相对寻址,所以存在 这是必需的,因为rip指向以下指令,该指令在 然后,如果我们将源代码修改为
在"全局和静态"区域中:) C++中有几个内存区域
请参阅此处了解您的问题的详细答案 这取决于您使用的平台和编译器。一些编译器直接存储在代码段中。静态变量总是只能被当前翻译单元访问,并且不会导出名称,因此不会发生名称冲突。 编译单元中声明的数据将进入该文件输出的.bss或.data。已在BSS中初始化数据,未在数据中倾斜。 静态数据和全局数据之间的区别在于在文件中包含符号信息。编译器倾向于包含符号信息,但只标记全局信息。 链接器尊重此信息。静态变量的符号信息被丢弃或损坏,这样静态变量仍可以以某种方式引用(使用调试或符号选项)。在任何情况下,当链接器首先解析本地引用时,编译单元都不会受到影响。 这是如何(容易理解): 这个问题有点太老了,但由于没有人指出任何有用的信息:通过"mohit12379"查看帖子,解释符号表中同名静态变量的存储:http://www.geekinterview.com/questionu详细信息/24745 我用objdump和gdb尝试过,结果是:
这是objdump结果
所以,也就是说,四个变量位于数据节事件中,名称相同,但偏移量不同。 静态变量存储在前面提到的数据段或代码段中。您可以确保不会在堆栈或堆上分配它。由于 答案很可能取决于编译器,所以你可能想编辑你的问题(我的意思是,即使段的概念不是由ISOC和ISO C++授权的)。例如,在Windows上,可执行文件不带符号名。一个"foo"是偏移量0x100,另一个可能是0x2b0,编译来自两个翻译单元的代码时都知道"它们的"foo的偏移量。 它们都将独立存储,但是如果您想向其他开发人员清楚地表明这一点,您可能会希望将它们包装在名称空间中。 您已经知道它存储在BSS(以符号开头的块)中,也称为未初始化的数据段,或者存储在已初始化的数据段中。 让我们举个简单的例子
上述静态变量未初始化,因此将转到未初始化的数据段(BSS)。
当然,它是由10初始化的,所以它进入初始化的数据段。 |
最新内容
相关内容
linux修改名称命令?
linux修改名称命令?,系统,名称,图片,查询系统,代码,名字,命令,用户,文件名,批量,linux怎么修改计算机名称1、在提示符下输入vi/etc/hosts,然后linux内置命令位置?
linux内置命令位置?,工作,系统,信息,地址,位置,标准,命令,目录,密码,名字,Linux系统常用操作命令有哪些1、linux常用命令: pwd命令 该命令的linux命令防火墙位置?
linux命令防火墙位置?,系统,服务,软件,密码,状态,位置,防火墙,工具,公共,设备,LINUX系统怎么关闭防火墙1、打开linux系统,在linux的桌面的空白linux改u盘名称命令?
linux改u盘名称命令?,系统,电脑,设备,名称,位置,工具,入主,盘中,地址,第一,linux下u盘使用的两种方法首先需要把U盘插入Linux电脑,确保U盘指示linux光标位置命令?
linux光标位置命令?,位置,光标,时间,系统,状态,终端,命令,程序,文件,菜单,linux下编辑文件时如何定位光标到文件末尾1、首先登录到Linux系统。linux命令文件换位置?
linux命令文件换位置?,位置,财务,系统,公司,名称,目录,文件,命令,一致,工作,linux怎么将一个文件移动到另一个目录下1、如果目标文件是到某一linux修改命令名称?
linux修改命令名称?,时间,系统,名称,图片,保险,代码,名字,一致,命令,文件,为什么修改linuxbin目录下的命令名字,不会显示修改时间1、注意:由于linux命令参数位置?
linux命令参数位置?,工作,系统,命令,信息,标准,状态,位置,地址,文件,简介,linux系统常用操作命令linux常用命令有pwd命令、cd命令、ls命令、calinux系统名称命令?
linux系统名称命令?,系统,工作,地址,管理,信息,标准,名称,网络,命令,目录,Linux系统常见命令linux系统常用操作命令如下:ls:全拼list,功能是列出linuxsu命令位置?
linuxsu命令位置?,系统,地址,环境,管理,位置,工作,命令,密码,信息,用户,linux切换用户命令1、打开系统中的终端命令框。使用whoami命令查看当Python 打包与独立可执行文件
Python 打包与独立可执行文件,平台,工具,标准,时代,信息,培训,庞大,项目,解决方案,多种,问题:即使是在30年之后,Python仍然没能拿到理想的方法,Python可执行文件和模块
Python可执行文件和模块,标准,培训,模块,文件,属性,上面,内容,变量,函数,源码,python源代码文件按照功能可以分为两种类型:用于执行的可执行程