c++ - 初始化静态变量时sbrk(0)指向什么?

标签 c++ unix memory

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++ 代码的典型编译步骤在编译时确定数据段的大小。

如下图所示,

Memory layout

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/

相关文章:

c++ - OpenCV 2.4.8 编译链接错误

C++ 连接三个字符数组

c++ - 如何在 Eclipse 中添加自定义构建行为

python - 安排自动化 shell 脚本不以 ROOT 身​​份运行

memory - 如何缓解 OpenCL/CUDA 中的主机 + 设备内存传输瓶颈

c - 栈和堆的内存分配量(c)

c++ - TTF_RenderUTF8_Shaded 无效读取

regex - 仅打印以特定数值结尾的行

linux - 循环运行 shell 脚本时出错

javascript - jQuery:展开 HTML 字符串中的元素