- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
静态内存布局的 BSS 部分 [应该] 用于“未初始化的全局变量”或“设置为 0 的全局变量”。
我正在运行一些测试,突然注意到局部静态变量也在增加 BSS 段的大小。
例子:-
在任何静态变量之前
int main (int argc, char argv[])
{
return 0;
}
data/repos/e-c
❯ size a.out
text data bss dec hex filename
1418 544 8 1970 7b2 a.out
在静态变量之后
int main (int argc, char *argv[])
{
static int a, b, c;
return 0;
}
data/repos/e-c
❯ !s
size a.out
text data bss dec hex filename
1418 544 16 1978 7ba a.out
那些变量肯定不是全局变量,那为什么BSS段会增加呢?或者“未初始化的全局变量的段”的想法不完全正确?
目前我在 Linux 上使用 GCC 编译器(版本 9.3.0)。
最佳答案
The BSS section of the static memory layout is [supposed to be] for"Uninitialized global variables" or "Global variables set to 0".
不清楚您是从哪里得到这种印象的,但这充其量只是一种误导。大多数人在 C 上下文中使用术语“全局变量”是指具有外部链接 的对象标识符,这对于具有静态存储持续时间 的对象来说是必然的。有一些附带条件,这样的标识符可以在程序的任何地方使用来指代同一个对象,因此是“全局的”。一些附带条件的存在和性质使得使用“全局”一词来描述这些条件有点令人担忧,但我会把它留给另一个答案。
关于BSS的关键点不是链接而是存储时长。静态存储持续时间意味着,至少在原则上,对象在程序开始时或之前开始存在*,并且(至少)存在直到程序终止。与在没有 static
的 block 范围内声明的变量对比:它们具有自动存储持续时间,这意味着它们在声明时就存在,并且仅在执行它们的最内层包含时才存在 block 终止。
具有静态存储持续时间的对象需要在程序镜像中表示,而不管它们的链接如何,因为它们与程序本身具有相同的生命周期。 C 指定如果此类对象未显式初始化,则它们的初始值就好像它们被初始化为 0(对于数字类型)或初始化为 NULL
(指针类型)或按成员方式初始化为这些复合类型类型。 BSS 是一种节省空间和时间的快捷方式,用于表示此类对象和明确初始化为 0 的对象的存储。
满足初始化条件的所谓“全局”变量可以并且通常归因于 BSS,但也是如此
static
对该范围内的声明的影响;这些变量自动具有静态存储持续时间,但只能从一个源文件访问,和static
关键字指定的那样,即使这些变量没有链接。*在 C++ 中,其中一些对象稍后会进行动态初始化,但此类对象的内存仍会在整个程序运行期间保留,并且它们会进行零初始化在程序启动时。为了这个答案的目的,他们保留了内存和明确定义的值(value)构成了存在。
关于c++ - 为什么局部静态变量是 BSS 段的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66390645/
我一直假设链接器分配了任何库的 bss 部分并将其映射到进程中。该部分的大小将取决于库报告的 bss 的大小。 我查看了进程的/proc/[PID]/maps 文件,并计算了加载库的 bss 部分的大
这个问题已经有答案了: No .BSS in PE file (2 个回答) 已关闭 6 年前。 我使用 NASM 组装了以下代码: global _start section .data v
我正在编写一些适用于 .o 文件的自定义 ELF 二进制后处理代码。部分处理包括对二进制数据执行重定位。输入文件由 GNU 汇编程序根据我自己的汇编代码生成。 看看 GNU 汇编程序生成的这些疯狂的重
“.bss”命令在 MSP430 汇编代码中起什么作用?例如,“.bss beep_cnt,2”对变量 beep_cnt2 有何作用? .bss beep_cnt,2
我知道 BSS 段存储未初始化的全局和静态变量并将它们初始化为零。但是如果全局/静态变量被初始化并且我的第二个问题是我读到 BSS 段不消耗内存,那么它存储这些变量的位置呢?谢谢 最佳答案 您可能读到
我一直在研究减少应用程序的内存占用。继上一个问题后:GDB - can I find large data elements in memory我已经找到并删除了大多数最大的罪魁祸首。 nm --si
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: .bss section in elf file 你好, BSS(Block started by symb
这个问题在这里已经有了答案: Why is the .bss segment required? (6 个答案) 关闭 4 年前。 .bss 部分的意义是什么,因为我们已经有单独的数据部分。它比数据
这个问题在这里已经有了答案: Why is the .bss segment required? (6 个答案) 关闭 6 年前。 在C编程中,当一个程序执行时,程序中使用的所有数据都会被放在不同的
这是简短的控制台应用程序示例 static char buffer[4096]; int main() { for(int i=0;i<4096;i++) { buffer[i
正如我们所知,.bss 包含未初始化的变量。如果在 C 代码中,程序员在使用它们之前初始化变量。那么在执行 C 代码之前.bss 不必为零。 我说得对吗? 谢谢 最佳答案 在 C 代码中,任何具有静态
我正在使用一个测试程序来了解内核版本为 2.6.32-279.el6.x86_64 的 linux 6.3 上的 C 内存模型。 首先我编译了下面的代码, #include int main(voi
我想在编译时声明我的 C 程序中的所有变量,例如: char cache[CACHE_SIZE]; char udp_ring[MAX_UDP_PACKET_SIZE*MAX_REQUESTS]; i
我知道 .bss 的默认对齐方式对于 GCC 是 8 字节,正如这个问题中提到的 Why the int type takes up 8 bytes in BSS section but 4 byte
我有一个功能: void testfunction() { static char_t theChar1 = 1; static unsigned char smallArray[1]; sta
据我所知,如果设置了 -fzero-initialized-in-bss,则未明确初始化的静态变量(并且对于 GCC,即使是那些明确初始化为零的变量,默认情况下就是这种情况)通常存储在 BSS 段中。
静态内存布局的 BSS 部分 [应该] 用于“未初始化的全局变量”或“设置为 0 的全局变量”。 我正在运行一些测试,突然注意到局部静态变量也在增加 BSS 段的大小。 例子:- 在任何静态变量之前
静态内存布局的 BSS 部分 [应该] 用于“未初始化的全局变量”或“设置为 0 的全局变量”。 我正在运行一些测试,突然注意到局部静态变量也在增加 BSS 段的大小。 例子:- 在任何静态变量之前
我正在学习虚拟内存管理和进程内存分配。并对此做一些实验。有以下一些容易混淆的地方: 案例1 #include int main() { return 0; } 编译代码并使用二进制文件运行
希望有人能帮助我了解我在大学学习的一个漏洞。 在c代码中有一个未绑定(bind)的strcat strcat(buffer, argv[1]); 目的是将该缓冲区溢出到保存的 EIP 中,并让它显示在
我是一名优秀的程序员,十分优秀!