C++ 头文件更改程序中断

C++ header files changes program break

提问人:Mikayel Smbatyan 提问时间:10/25/2023 更新时间:10/30/2023 访问量:222

问:

我不明白为什么这段代码会打印不同的程序中断

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <ftw.h>
#include <stdlib.h>

int main()
{
    int max_size = 1024;
    char* ptr[max_size];

    int blockCount = 1000;
    int blockSize = 4*1024*1024;
    int from = 1;
    int to = blockCount;
    int step = 1;
    int i;

    printf("Program break: 0x%p\n", sbrk(0));
    for(i = 0; i < blockCount; ++i)
    {
        ptr[i] = (char*)malloc(blockSize);
    }

    printf("Program break: 0x%p\n", sbrk(0));
    for(int i = from; i < to; i += step)
    {
        free((char*)ptr[i]);
    }

    printf("Program break: 0x%p\n", sbrk(0));
}

输出:

Program break: 0x0x5604211f1000
Program break: 0x0x560421212000
Program break: 0x0x560421212000

但是,如果我在文件的开头加上一个,它会打印相同的程序中断。#include <iostream>

输出:

Program break: 0x0x556617053000
Program break: 0x0x556617053000
Program break: 0x0x556617053000

它会更改标题中的程序中断吗? 如果是这样,什么可能会更改头文件中的程序中断? 此外,如果编译为 C 代码,则最后一个程序中断指向初始代码。好像返回未使用的页面。 但在 C++ 的情况下,它不会发生。free

G++ 版本:9.4.0

编译选项:-O0

操作系统/ABI:UNIX - System V

ABI 版本:0

内核版本:5.15.0-87-generic

发行版:Ubuntu 20.04.6 LTS

C++ C Linux malloc abi

评论

3赞 Quimby 10/25/2023
例如,是一个全局对象,我会说它可能会在创建时分配一些缓冲区。std::cout
1赞 Quimby 10/25/2023
无论如何,您可以跟踪或查看谁以及为什么调用它。sbrkmalloc
0赞 Mikayel Smbatyan 10/25/2023
@Quimby,是的,但那记忆有多少?你看,如果一个“malloc”如此多的内存程序中断应该改变。C++全局对象的分配是在__start期间完成的
0赞 463035818_is_not_an_ai 10/25/2023
问题到底是什么?为什么您发布的代码打印不同的值?为什么在包含时打印相同的值?为什么 C 语言中的行为不同?我建议你把问题缩小到一个问题,我敢打赌,一个问题的答案也会对其他问题有所帮助<iostream>
3赞 teapot418 10/25/2023
实际上,4MB 的分配高于 mmap 的阈值,因此您也可以期望这些分配根本不会移动中断。

答:

1赞 Mikayel Smbatyan 10/25/2023 #1

如前所述@teapot418

实际上,4MB 的分配高于 mmap 的阈值,因此您可以 也希望那些根本不会移动休息。