C 中的局部变量和静态变量

2024-02-24

编译时:

// external definitions
int value1 = 0;
static int value2 = 0;

gcc 编译器生成以下程序集:

.globl value1
        .bss
        .align 4
        .type   value1, @object
        .size   value1, 4
value1:
        .zero   4
        .local  value2
        .comm   value2,4,4

但是,当我将变量初始化为非零值时,例如:

// external definitions
int value1 = 1;
static int value2 = 1;

gcc 编译器生成以下内容:

.globl value1
        .data
        .align 4
        .type   value1, @object
        .size   value1, 4
value1:
        .long   1
        .align 4
        .type   value2, @object
        .size   value2, 4
value2:
        .long   1

我的问题是:

  1. 为什么在第一种情况下,值分配在 bss 段中,而在第二种情况下,值分配在数据段中。
  2. 为什么 value2 变量在第一种情况下被定义为 .local 和 .comm,而在第二种情况下则不是。

一般来说,bss部分包含未初始化的值和data部分包含初始化值。然而,gcc 将初始化为零的值放入bss部分而不是data部分,作为bss无论如何,该部分在运行时都会被清零,在该部分中存储零没有多大意义data部分,这可以节省一些磁盘空间,来自 man gcc:

-fno-zero-initialized-in-bss 如果目标支持 BSS 部分,GCC 默认将初始化为零的变量放入 BSS 中。这 可以节省结果代码的空间。该选项关闭此功能 行为,因为某些程序明确依赖于变量 数据部分

我不知道为什么.comm与使用static存储是目标文件的本地存储,通常用于声明公共符号,如果not定义/初始化,应由链接器与其他目标文件中具有相同名称的符号合并,这就是第二个示例中未使用它的原因,因为变量是从as manual http://sourceware.org/binutils/docs-2.20/as/Comm.html#Comm

.comm 声明一个名为symbol 的通用符号。链接时,通用 一个目标文件中的符号可以与定义的或公共的符号合并 另一个目标文件中的同名符号

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中的局部变量和静态变量 的相关文章

随机推荐

  • Heroku docker spring boot 镜像错误 503 H14

    几天前 我尝试将 Spring Boot 应用程序的 docker 镜像部署到 heroku 中 我有以下泊坞窗文件 FROM openjdk 8 jdk alpine LABEL maintainer email protected cd
  • java循环重复程序

    我对 Java 非常陌生 我已经在上课的第二周左右了 我需要我的程序根据用户继续运行或退出 这是一个工资计算 我希望最后说 你想继续吗 y n 我希望 Y 重复我的整个问题程序和不结束程序 我正在使用 Jgrasp 而且我是非常非常新的 我
  • 如何在 FiraCode for Visual Studio 2015 中启用连字

    我下载了 FiraCode 字体 并选择它作为 Visual Studio 中的字体 然而 连字没有显示 并且 wiki 没有针对 Visual Studio 的任何特殊说明 尽管他们暗示它可以工作 因为它列在其 WORKS 列中以提供编辑
  • MySQL仅当查询包装为子查询时出现重复列错误

    我有一个如下所示的选择查询 SELECT FROM A LEFT JOIN B ON B x A y LEFT JOIN C WHERE GROUP BY ORDER BY 所有桌子都有id列和查询运行良好 结果有很多id列没有错误并且驱动
  • ASP.NET [GridView 的水平滚动]

    如何为我的大 GridView 制作水平滚动 尝试包裹一个 div style width 100 div 围绕 GridView
  • 创建独立的 .exe 文件

    我有一个在 Visual Studio 2010 中构建的控制台应用程序 当我实际构建项目时 我在 bin Debug MyProj exe 下获取 exe 文件 当我从其他位置粘贴并运行此 exe 时 它 也需要其他文件 有什么想法我怎样
  • 电子邮件客户端如何处理 cookie?

    假设我在电子邮件中的图像请求上设置了 cookie 因此当用户查看电子邮件中的图像时会设置 cookie 如果用户随后点击电子邮件打开浏览器 浏览器是否可以访问我刚刚设置的 cookie 显然 如果用户将 Outlook 作为电子邮件客户端
  • 可移植类库中的 Thread.Sleep()

    The MSDN文档说Thread Sleep 可以用在portable类库 编译器另有说明 除了自旋循环之外 我还有什么选择 Thread CurrentThread Join 也不存在 项目文件
  • Ajax跨源请求被阻止:同源策略不允许读取远程资源

    我正在编写一个简单的网站 它以习语作为输入 并从牛津词典返回其含义和示例 这是我的想法 我向以下 URL 发送请求 http www oxfordlearnersdictionaries com search english direct
  • 组织项目中文件的最佳方式

    组织项目中文件的最佳方式是什么 例如 您是否将所有用户控件放在单独的文件夹中 还是将它们放在子文件夹中 你有业务逻辑文件夹吗 助手类文件夹 我曾经这样组织我的项目 项目 用户控件 模块名称 项目 课程 模块名称 现在我正在学习更多这样的事情
  • Kohana 3 自动加载模型

    我正在尝试使用模型 但出现致命错误 因此我认为它无法正确自动加载 ErrorException 致命错误 类 未找到 属性 模型 有问题的控制器线路 properties new Properties Model 该模型 class Pro
  • 验证 JIRA 时发生卷曲错误

    curl H Content Type application json charset UTF 8 d username admin password admin http localhost 2990 jira rest auth 1
  • 将 JavaScript 字符串拆分为代码点数组? (考虑“代理对”但不考虑“字素簇”)

    将 JavaScript 字符串拆分为 字符 可以轻松完成 但如果您关心 Unicode 并且您应该关心 Unicode 则会出现问题 JavaScript 本身将字符视为 16 位实体 UCS 2 或 UTF 16 https en wi
  • 指定 JavaScript 正则表达式中的模式重复次数

    我在中使用了正则表达式C 有一种方法可以指定任何模式的重复次数 0 9a zA Z 3 15 上面的正则表达式将检查该模式 0 9a zA Z 将重复 3 至 15 次 当我尝试做同样的事情时JavaScript 这是行不通的 var re
  • 多模块 Gradle 项目 - 从 Spring-Boot 1.5 迁移到 2.1

    我想将多模块 spring boot 1 5 项目迁移到 spring boot 2 1 这是一个 gradle 项目 4 9 但不知何故我没有解决它 使用 spring boot 1 5 9 应用程序编译良好 依赖于其他模块的模块也可以解
  • Ajax工具包AjaxFileUpload抛出异常

    我有一个条目表单 我想添加一个文件上传器 我在母版页中添加了一个工具包脚本管理器 然后我添加了一个ajaxfileupload控件
  • 尝试以各种可能的方式嵌入 SVG 对象,但浏览器在渲染 html 时提示保存文件

    已尝试过 W3 学校列出的所有嵌入方法以及更多方法 即使提供了宽度和高度 资源管理器也会显示不正确的大小 chrome和firefox只是提示下载 使用 Visual Studio 2010 内置的开发服务器 可能需要添加 mime 类型来
  • SQL 查询返回过去 24 小时内每小时的值

    我有一个问题 但我真的不知道如何开始 我希望有人能帮助我解决这个问题 我将从解释该表开始 我有一个包含四列的设备表 Device Id Device Status Begin dt End dt 有 6 种不同的状态 其中 3 为简单起见
  • 正则表达式匹配不在引号内的所有实例

    From this q a https stackoverflow com questions 2700953 a regex to match a comma that isnt surrounded by quotes 我推断匹配给定正
  • C 中的局部变量和静态变量

    编译时 external definitions int value1 0 static int value2 0 gcc 编译器生成以下程序集 globl value1 bss align 4 type value1 object siz