在 C++ 中,main 函数和其他函数是否使用相同的堆栈 space?

Did main function and the other function using the same stack space in C++?

void fun(){
    int val2 = 0;
}
int main(){
    int val1 = 0;
    fun();
}

如果 &val10x7fff55e54a8c ,那么 &val2 会是什么? 在我的机器上是 0x7fff55e549fc,不应该是 0x7fff55e54a880x7fff55e54a90 吗? 如果不是,调用内存中的另一个函数会发生什么?

if &val1 is 0x7fff55e54a8c , what will &val2 be?

在 c++ 标准规范内无法预测。

你的所有函数共享同一个堆栈space,除非你有线程局部变量。

对于函数调用,可能会放置堆栈帧操作,因此您无法预测 &val&val2 实际放置在共享堆栈上的关系。

根据 c++ 标准定义,您无法为某些地址假定任何内容。

每个线程都有一个保留堆栈 space,在您的情况下,两个函数 运行 在同一个线程中,因此它们都使用相同的堆栈 space。

在 windows 中,默认情况下使用 MSVC 每个线程都会为堆栈分配 1MB,现在这就是为什么该信息很重要。

void func1();
int main()
{
    char abusive_stack_usage[900'000];

    // we are about to call func1, and we only have 100kb left to use in the stack.
    func1();
}

void func1()
{
    // here we use more than 100kb, therefore we get a Whosebug.
    char abusive_stack_usage[200'000];
}

在下面的示例中我们没有得到 Whosebug

void func1()
{
    //we use 800kb here (available in stack: 200kb)   
    char abusive_stack_usage[800'000];

} // we release those 800kb here  (available in stack: 1mb)

void func2()
{
    char abusive_stack_usage[800'000];
} 

int main()
{
    // available: 1mb
    func1();

    // available: 1mb
    func2();
}

这里有一个很好的解释:

  1. C的内存布局 程序

  2. Linux内存布局测试通过 C