- 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/
如果我们定义一个像这样的函数 (defun foo(x) (setf x somevalue)) x 定义为局部变量还是全局变量?使用 setf/q 将值设置为全局值。如果它是全局的,谁能告诉我如
仍在学习 MVC3、EF。现在我正在连接到 MySql,但我相信这无关紧要。为简单起见,我决定为我的测试应用程序使用一个数据库,并且我包含了一个类别来区分数据。例如,我有一个新闻、事件、信息和页面类别
假设我定义了以下代码: int *func() { int *p=(int *)malloc(sizeof(int)); // memory is allocated from heap
我正在构建一个小型 PHP MVC,但我在一小部分编码方面碰壁了。我想我需要“局部 View ”,但我也许可以用现有代码实现一些东西。 目前我的 Controller 是最简单的形式: 实例化一个对象
假设我定义了以下代码: int *func() { int *p=(int *)malloc(sizeof(int)); // memory is allocated from heap
我有以下代码(用 Python 2.X 编写): def banana(x): def apple(stuff): x /= 10 return stuff -
我正在尝试重用一些代码,部分 View 似乎是使用 MVC 时执行此操作的最佳方式。 我创建了一个继承自 IEnumerable 的局部 View (见下文)。 @model IEnumerable
局部 const 变量将存储在哪里?我已经验证过,函数中使用 const 变量的每个位置都会被其值替换(如立即值寻址模式)。但如果指针被分配给它,那么它就会存储在堆栈中。在这里我不明白处理器如何知道其
我想将局部变量用作全局变量,有人告诉我这样做的方法是在函数外部创建变量,如下所示: var foo = null; function bar() {
我正在处理一个很长的 Angular 表格。我想知道我是否可以将它分成许多不同的 View 并在主视图中引用它们中的每一个。 First Section
我有一个导航栏,它是一个局部 View ,我需要在设计页面上呈现它,以便用户编辑他们的个人资料。事实上,我只有一个页面,但是添加执行帐户维护的路径搞乱了我的导航栏加载,因为实例变量不存在。无论如何,我
我没有用到全局变量,也从未明确定义过全局变量,但我的代码中似乎有一个。你能帮我把它做成本地的吗? def algo(X): # randomized algorithm while len(X
假设我有这个(当前无返回)函数: def codepoint_convert(text, offset): codepoint = text[offset] if codepoint
我在我的项目中同时使用了局部 View 和布局概念,但我无法区分。但我的感觉是两者都在做同样的工作。任何人都可以通过示例说出有关局部 View 和布局的简要概念以及区别吗? 最佳答案 除了 Josh
使用全局变量会加快速度吗?在英特尔的体系结构软件开发人员手册(关于微处理器)中建议使用局部变量而不是全局变量。但是,请考虑以下代码: void process_tcp_packets(void) {
我有一个局部 View 使用的模型与我在其中呈现它的 View 不同。我不断收到错误消息。 The model item passed into the dictionary is of type '
我在 cshtml 页面上有一个局部 View ,如下所示:- @model MvcCommons.ViewModels.CompositeViewModel @{ ViewBag.Title = "
我在从 while 循环全局更新数组时遇到问题,如下所述。请注意,我只能使用 C 95 及之前版本的功能。任何帮助将不胜感激!满浆箱http://pastebin.com/ss6VgTCD 在我的程序
我想刷新 Json 局部 View 。我正在尝试使用这个: $('#example123').load('@Url.Action("Rejestracja", "Logowanie")'); 但不能正
我有一个 asp.net 页面,它返回我当前正在使用的选项卡中的部分 View 。我已经设置了所有 jQuery 并且可以正常工作。它工作一次并通过 ajax 返回一个局部 View .html(re
我是一名优秀的程序员,十分优秀!