gpt4 book ai didi

c++ - 为什么 C 和 C++ 编译器将显式初始化和默认初始化的全局变量放在不同的段中?

转载 作者:IT老高 更新时间:2023-10-28 12:52:47 25 4
gpt4 key购买 nike

我正在阅读 this great post about memory layout of C programs .它说默认初始化的全局变量位于 BSS segment , 如果你明确地为全局变量提供一个值,那么它将驻留在 data segment .

我用 C 和 C++ 测试了以下程序来检查这种行为。

#include <iostream>
// Both i and s are having static storage duration
int i; // i will be kept in the BSS segment, default initialized variable, default value=0
int s(5); // s will be kept in the data segment, explicitly initialized variable,
int main()
{
std::cout<<&i<<' '<<&s;
}

输出:

0x488020 0x478004

因此,从输出来看,变量 i 和 s 显然位于完全不同的段中。但是,如果我从变量 S 中删除初始化程序(该程序中的初始值 5)然后运行程序,它会给我以下输出。

输出:

0x488020 0x488024

因此,从输出看,变量 i 和 s 显然位于同一个(在本例中为 BSS)段中。

这种行为在 C 中也是一样的。

#include <stdio.h>
int i; // i will be kept in the BSS segment, default initialized variable, default value=0
int s=5; // s will be kept in the data segment, explicitly initialized variable,
int main(void)
{
printf("%p %p\n",(void*)&i,(void*)&s);
}

输出:

004053D0 00403004

所以,我们可以再次通过查看输出(意味着检查变量的地址)说,变量 i 和 s 都位于完全不同的段中。但是,如果我从变量 S 中删除初始化程序(该程序中的初始值 5),然后运行该程序,它会给我以下输出。

输出:

004053D0 004053D4

因此,从输出看,变量 i 和 s 显然位于同一个(在本例中为 BSS)段中。

为什么 C 和 C++ 编译器将显式初始化和默认初始化的全局变量放在不同的段中?为什么全局变量在默认初始化变量和显式初始化变量之间存在差异?如果我没记错的话,C 和 C++ 标准从不谈论堆栈、堆、数据段、代码段、BSS 段以及所有这些特定于实现的东西。那么,C++ 实现是否可以将显式初始化和默认初始化的变量存储在同一段中,而不是将其保存在不同的段中?

最佳答案

C 或 C++ 语言都没有“段”的概念,而且并非所有操作系统都有,因此您的问题不可避免地取决于平台和编译器。

也就是说,常见的实现会以不同的方式对待已初始化变量和未初始化变量。主要区别在于未初始化(或默认为 0 初始化)的数据确实不必必须与已编译的模块一起实际保存,但只有 已声明/保留以供以后在运行时使用时间。在实际的“段”术语中,初始化的数据作为二进制文件的一部分保存到磁盘,而未初始化的数据不是,而是在启动时分配以满足声明的“保留” ”。

关于c++ - 为什么 C 和 C++ 编译器将显式初始化和默认初始化的全局变量放在不同的段中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34367781/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com