gpt4 book ai didi

c - .bss 与 .data : static q32 vs static int

转载 作者:太空宇宙 更新时间:2023-11-03 23:39:52 29 4
gpt4 key购买 nike

以下代码是为 DSP 目标处理器编译和链接的:

测试.c:

static q32 a[15] = { 
Q31(0.1f),Q31(0.2f),Q31(0.3f),Q31(0.4f),Q31(0.5f),
Q31(0.1f),Q31(0.2f),Q31(0.3f),Q31(0.4f),Q31(0.5f),
Q31(0.1f),Q31(0.2f),Q31(0.3f),Q31(0.4f),Q31(0.5f)
};

static int b[3] = { 1, 1, 0 };

int main()
{
// ...
return 0;
}

q32是定点类型,4字节。

链接代码后,.map 文件告诉我以下内容:Test.o: .bss 60, .data 12.

为什么 a(60 字节)在 .bss 部分结束,而 b(12 字节)在 .data 部分?我希望两者都进入 .data

最佳答案

这就是应该如何使用 .bss。因为它应该代表未初始化的数据(我没有说它包含未初始化的变量!),假设 BSS 段仅保存还没有任何值的变量,因此它实际上不需要存储这些变量。因此,BSS 是一种优化,目标文件将只包含一个值,比方说现在变量所需的空间。即 15 * 4 = 60。

维基说,

The size that BSS will require at runtime is recorded in the object file, but BSS (unlike the data segment) doesn't take up any actual space in the object file.

这是使可执行文件体积更小的一种方法。

现在,由于 Q31 是一个展开为 ((q32)(int)((double)(x)*(double)0x80000000UL)的宏, Q31(1.0f) 显然在编译时仍然无法理解。因此,它被视为未初始化,因此进入 .bss。

虽然,((q32)(int)((double)(x)*(double)0x80000000UL 已知是固定常量表达式。

尝试输入固定值,您应该会在 .data 段中看到它们。

无论如何,一旦程序加载完成,它是在哪个段都没有关系。

关于c - .bss 与 .data : static q32 vs static int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48742163/

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