在 sbrk(2) manual ,
它指出
Calling
sbrk()
with an increment of 0 can be used to find the current location of the program break.
当使用 sbrk(0)
初始化 static
变量时,它是如何工作的?
说,
static void* current_heap = sbrk(0);
这种好奇心源于 C/C++ 代码的典型编译步骤在编译时确定数据段的大小。
如下图所示,
Distributed under CC BY-SA 3.0
初始化的静态变量存储在数据段中。据我所知,堆通常是从BSS和数据段的末尾开始的。
sbrk(0)
如何知道编译期间堆从哪里开始,而其他静态变量可能尚未确定?
更新:
正如 @EugeneSh 所指出的,这是一个使用 clang++
编译的工作示例:
#include <unistd.h>
#include <iostream>
static void* current_heap = sbrk(0);
int main() {
std::cout << current_heap << '\n';
}
最佳答案
在 C 中,此代码无效:
static void* current_heap = sbrk(0);
因为具有静态存储持续时间的对象的初始值设定项必须是编译时常量,但事实并非如此。所以这段代码在 C 语言中将无法编译。
对于 C++,当程序在调用 main
之前的某个时刻运行时,将调用该函数。
因此没有对 sbrk
的编译时调用。
至于这个变量将驻留在哪个部分,它很可能位于 .bss 中,因为它在编译时没有初始化。事实上,如果我用 g++ 编译你的代码,变量就会被放置在 .bss 中。
关于c++ - 初始化静态变量时sbrk(0)指向什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65307986/