9

我有以下 C 代码:

   //declared at the beginning of the CAStar.c file:
    int TERRAIN_PASSABLE = 1;
    int TERRAIN_IMPASSABLE = 0;
    int TERRAIN_SOME_WHAT_PASSABLE = 2;

我注意到对于这些变量中的任何一个,如果它们具有非零值,它们会被“nm”命令报告为类型“D”(已初始化):

_TERRAIN_PASSABLE          |00000008|   D  |
_TERRAIN_SOME_WHAT_PASSABLE|00000004|   D  |

但是,那些初始化为 0 的报告为“B”(未初始化):

_TERRAIN_IMPASSABLE        |00000000|   B  |

为什么“用 0 初始化”和“用除 0 以外的其他东西初始化”之间的区别?

4

2 回答 2

5

这或多或少是关于 BSS 的工作原理和使用方式。B 表示该变量将被放置在 BSS 部分(你是对的,它是未初始化的数据部分)。D 表示符号放置在初始化的数据段中。

例如阅读这篇文章,了解更多关于 BSS 的工作原理和用途的信息。

于 2013-12-10T10:19:17.590 回答
4

这些变量很可能是在文件范围内声明的,为它们提供静态存储持续时间

出于优化目的,所有具有静态存储持续时间的变量都由编译器/链接器分为两类:初始化为 0 或初始化为其他值。初始化为零的变量放置在通常称为 的内存段中.bss,而初始化为另一个值的变量则放置在 中.data

这样做的原因是,.bss如果在相邻内存中分配变量,则可以更快地初始化变量。基本上,它们将使用单个memset. 此外,它将减少所需的 ROM 数量。相关问题的详细信息。

编辑

.bss 变量最终处于未初始化状态的原因可能是因为 C 语言 (C11 6.7.9/10) 中有一条规则规定所有未由程序员显式初始化的静态存储持续时间变量(它们是“未初始化的” ),应初始化为零

于 2013-12-10T10:20:38.773 回答