C/C++ 全局变量初始化

2023-10-29

C语言全局变量只能用常量表达式初始化,不能用一个数学函数或者其他的需要在运行时才能计算出结果的表达式进行初始化。

C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊,main 函数执行前到底具体是什么时候呢?是编译时还是运行时?答案是既有编译时,也可能会有运行时(seriously), 从语言的层面来说,全局变量的初始化可以划分为以下两个阶段(c++11 N3690 3.6.2):

  • static initialization: 静态初始化指的是用常量来对变量进行初始化,主要包括 zero initialization 和 const initialization,静态初始化在程序加载的过程中完成,对简单类型(内建类型,POD等)来说,从具体实现上看,zero initialization 的变量会被保存在 bss 段,const initialization 的变量则放在 data 段内,程序加载即可完成初始化,这和 c 语言里的全局变量初始化基本是一致的。

  • dynamic initialization:动态初始化主要是指需要经过函数调用才能完成的初始化,比如说:int a = foo(),或者是复杂类型(类)的初始化(需要调用构造函数)等。这些变量的初始化会在 main 函数执行前由运行时调用相应的代码从而得以进行(函数内的 static 变量除外)。

需要明确的是:静态初始化执行先于动态初始化! 只有当所有静态初始化执行完毕,动态初始化才会执行。显然,这样的设计是很直观的,能静态初始化的变量,它的初始值都是在编译时就能确定,因此可以直接 hard code 到生成的代码里,而动态初始化需要在运行时执行相应的动作才能进行,因此,静态初始化先于动态初始化是必然的。

对于出现在同一个编译单元内的全局变量来说,它们初始化的顺序与他们声明的顺序是一致的(销毁的顺序则反过来),而对于不同编译单元间的全局变量,c++ 标准并没有明确规定它们之间的初始化(销毁)顺序应该怎样,因此实现上完全由编译器自己决定,一个比较普遍的认识是:不同编译单元间的全局变量的初始化顺序是不固定的,哪怕对同一个编译器,同一份代码来说,任意两次编译的结果都有可能不一样。

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

C/C++ 全局变量初始化 的相关文章

随机推荐

  • Burst(突发)信号详解

    突发信号是一个根据字面意思非常难以理解的信号 为此头疼了好久 终于理解了什么是突发信号 突发是指在同一行中相邻的存储单元连续进行数据传输的方式 连续传输所涉及到存储单元 列 的数量就是突发长度 SDRAM 简称BL burst length
  • EQ均衡器原理

    做音乐最离不开的效果器是什么 相信大多数朋友都会回答 是EQ 不错 正是有了这个所谓 均衡 的效果器 我们的音乐才不会过载 乐器音色才会如此丰富 然而知道1加1等于2更要知道1加1为什么等于2 今天我把这个效果器扒光 从根本上来分析它的工作
  • my-innodb-heavy-4G.cnf配置文件详解

    client 客户端 port 3306 客户端连接端口 socket tmp mysql sock 客户端套接字文件的路径 mysqld port 3306 服务器监听端口 socket tmp mysql sock 服务器套接字文件的路
  • 做自动化测试可选择的工具有哪些?

    如今 作为一名软件测试工程师 几乎所有人都需要具备自动化测试相关的知识 并且懂得如何去利用工具 来为企业减少时间成本和错误成本 这是为什么呢 在以前 会测试人员一般都只需要扮演终端用户 会做手动测试用例并记录观察结果就足够了 但如今 一旦你
  • QT中connect函数中的lambda表达式关于局部变量的按值拷贝与按引用拷贝,以及mutable关键字

    1 当lambda表达式中使用 时 为按值拷贝作用范围的局部变量 默认不可修改按值传进来的拷贝 如图 不加mutable时报错 a不可改变 加mutable后可以改变a值 但是时修改的拷贝对象 connect上边的a值未修改 include
  • Spring Boot 3.0 (十四): Spring Boot 整合 Shiro安全框架

    官方暂时还没有适配 Spring Boot 3 X 这篇文章我们来学习如何使用 Spring Boot 集成 Apache Shiro 安全应该是互联网公司的一道生命线 几乎任何的公司都会涉及到这方面的需求 在 Java 领域一般有 Spr
  • wxc-progress使用

  • docker 安装gitlab

    https www cnblogs com zuxing articles 9329152 html
  • C语言中输出string方法c_str()用法

    今天突然用printf s str str 是一个string 的时候突然出现乱码 就查了一下为什么 任何时候只有自己敲代码的时候才能发现 可以用cout lt
  • 智慧节能照明系统的八大应用场景

    节能 作为社会经济发展的主旋律 在生产生活的方面都要积极实践 照明是首当其冲需要进行节能升级的 智慧节能照明系统解决方案 基于电力网络 以物联网 自动化控制 无线通讯等技术 结合智能化物联网设备 实现对照明系统的集中 定时 模式等多样化控制
  • xcode编译代码的时候 ld: library not found for -xxx 解决方法

    有时候在Xcode下面我们需要引入第三方类库 或者自己写的静态库 如果配置不正确 就会出现如下错误 ld library not found for lpcre clang error linker command failed with
  • Redis:实现全局唯一ID

    Redis 实现全局唯一ID 一 概述 二 实现 1 获取初始时间戳 2 生成全局ID 三 测试 为什么可以实现全局唯一 其他唯一ID策略 补充 countDownLatch 一 概述 全局ID生成器 是一种在 分布式系统下 用来生成全局唯
  • 来 Azure 学习 OpenAI 四 - 用 Embedding 赋能 GPT

    大家好 我是学生大使 Jambo 在我们前一篇文章中 我们介绍了 OpenAI 模型的调用 今天 我将为大家介绍 Embedding 的使用 嵌入是什么 嵌入 Embedding 是一种将高维数据映射到低维空间的方法 嵌入可以将高维数据可视
  • HTTP介绍:一文了解什么是HTTP

    前言 在当今数字时代 互联网已经成为人们生活中不可或缺的一部分 无论是浏览网页 发送电子邮件还是在线购物 我们都离不开超文本传输协议 HTTP HTTP作为一种通信协议 扮演着连接客户端和服务器的重要角色 它不仅仅是一种简单的传输协议 更是
  • OSS/J即将获得飞速发展

    软件集成已经是运营商不得不面对的大问题了 数目众多的独立软件公司所提供的应用程序接口互不兼容所引发的互通性问题正使运营商焦头烂额 这也就是为什么基于Java技术的OSS OSS J 正在越来越得到重视的原因 OSS J推出的初衷是源于企业采
  • iostat 命令查看io信息

    在使用htop命令的时候会看到这么一行 翻译一下 us 用户态使用的cpu时间比 sy 系统态使用的cpu时间比 ni 用做nice加权的进程分配的用户态cpu时间比 id 空闲的cpu时间比 wa cpu等待磁盘写入完成时间 hi 硬中断
  • 大厂年薪30W+数据分析师学习路线,实用到哭!会Python的更有优势!

    不知道大家发现没 近几年 国内对数据分析类人才需求越来越大了 这点从国家开始批准大学设立数据分析相关专业就能看出来 2016年2月 教育部公布新增 数据科学与大数据技术 专业 北京大学 对外经济贸易大学 中南大学成为首家获批高校 后来又有中
  • 常用Shell命令汇总-vim

    不知道大家平时有没有跟我一样的感受 就是很多shell命令自己其实用过 但时间一久又忘记了 导致又要到处百度 开始写这个系列的目的第一是为了总结 第二是为了以后忘记时可以直接到这找哈哈哈哈哈 平时在百度时还发现一个问题 就是其实我只想要最常
  • 怎么看服务器的token信息,token查看

    token查看 内容精选 换一换 本章节通过示例演示如何调用API来删除负载均衡器 删除负载均衡器时 需要逐个删除负载均衡器下的资源 负载均衡器关联的资源如图1 包括监听器 转发策略 后端服务器组 健康检查和后端服务器 当您使用Token认
  • C/C++ 全局变量初始化

    C语言全局变量只能用常量表达式初始化 不能用一个数学函数或者其他的需要在运行时才能计算出结果的表达式进行初始化 C 标准 全局变量的初始化要在 main 函数执行前完成 常识无疑 但是这个说法有点含糊 main 函数执行前到底具体是什么时候