讲师中心 微信公众号
AI工具推荐 视频效率加速

C++全局变量存储位置_数据段(.data/.bss)与内存布局解析

夏芳姑娘_2953

夏芳姑娘_2953

发布时间:2026-03-23 20:13:03

|

212人浏览过

|

来源于php中文网

原创

全局变量存于.data或.bss段:未初始化或显式初始化为0的进.bss(磁盘不占空间,运行时零初始化);显式初始化为非零值的进.data(磁盘存初始值,加载时复制)。

c++全局变量存储位置_数据段(.data/.bss)与内存布局解析

全局变量到底存在哪儿?.data 和 .bss 的区别不是“有没有初始化”那么简单

全局变量的存储位置由链接器决定,不是编译器拍板。未初始化或初始化为 0 的全局变量(比如 int g_a;、static char buf[1024] = {};)进 .bss 段;显式初始化为非零值的(比如 int g_b = 42;)进 .data 段。关键在于:这两段在磁盘上不占实际空间(.bss 完全不存内容,.data 只存初始值),但加载到内存后都会映射为可读写数据页。

  • .bss 段在 ELF 文件里只记录大小,运行时由 loader 零初始化 —— 所以它节省磁盘空间,但首次写入仍会触发缺页中断
  • .data 段把初始值直接写进二进制文件,加载时 memcpy 进内存 —— 启动稍慢一点,但避免了首次写入的页错误开销
  • 用 size 命令看 .bss 大小:输出里 bss 列就是它;readelf -S 能确认段标志(.bss 是 ALLOC + WRITE,但 LOAD 为否)

为什么 static int x = 0; 在 .bss,而 static int y = 1; 却在 .data?

这不是 C++ 标准规定的“行为”,而是 ABI 和工具链的约定。标准只说“静态存储期对象零初始化”,没规定怎么存。GCC/Clang 默认遵守 System V ABI:所有“定义时求值为 0”的变量归 .bss,哪怕写了 = 0。但一旦初始化表达式含非常量(比如 = sizeof(int) 或内联 constexpr 函数调用),就可能被放进 .data —— 因为链接器无法在链接时确定值。

  • 容易踩的坑:static char big_buf[1 看似初始化了,其实等价于未初始化,进 <code>.bss;但若写成 = {1},整个 1MB 就打进 .data,二进制瞬间膨胀
  • 调试时用 objdump -t 查符号所在段:.bss 符号的 section 列显示 .bss,且 size 是十进制数(不是十六进制地址)
  • 注意 const 全局变量:如果类型是 POD 且初始化为常量表达式,通常进 .rodata,不属于 .data/.bss

extern 声明的全局变量不会分配存储,但链接失败往往卡在这儿

extern int g_flag; 本身不占内存,只是告诉编译器“这玩意儿在别处定义”。真正分配存储的是那个唯一的定义(比如 int g_flag = 1;)。如果漏掉定义,或者定义在某个被 strip 掉的 object 文件里,链接时报 undefined reference to 'g_flag' —— 此时查 .data/.bss 没用,得用 nm -C 挨个检查目标文件有没有 T(代码)、D(data)、B(bss)标记的符号。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 常见误操作:头文件里写 extern int log_level = 3; —— 这其实是定义(带初始化的 extern 是定义),会导致多个 TU 都生成 .data 条目,链接时报重复定义
  • 跨模块共享全局变量时,确保只有一个源文件包含定义,其余只用 extern 声明;C++ 内联变量(inline int g_cnt = 0;)可绕过此限制,但仍是 .data 存储
  • __attribute__((section(".mydata"))) 可强制变量进自定义段,但需同步修改链接脚本,否则运行时可能段不可写或地址冲突

内存布局里 .data/.bss 紧挨着堆,但别指望用指针算偏移来“偷空间”

典型进程内存布局中,.data 和 .bss 在低地址端,堆(brk)紧贴其后向上增长。理论上,&_end(.bss 结束地址)和 sbrk(0) 初始值很接近。但这是实现细节,不是标准保证。

立即学习“C++免费学习笔记(深入)”;

  • 不能依赖 _end 地址做内存管理:ASLR 可能随机化整个数据段基址;PIE 编译下整个程序地址都变;某些嵌入式 linker script 甚至把 .bss 搬到 RAM 末尾
  • 想动态扩展全局缓冲区?用 mmap(MAP_ANONYMOUS | MAP_PRIVATE),别试图 sbrk() 或改 .bss 大小 —— 后者需要重写 ELF header,运行时几乎不可能
  • 查看真实布局:Linux 下 /proc/self/maps(运行时)或 readelf -l(加载视图),注意 PT_LOAD segment 是否把 .data 和 .bss 合并在同一可写页中
事情说清了就结束

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6024

2023.10.24

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

4385

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1830

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6159

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3005

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3848

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2685

2025.08.29

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

0

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn