在 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();
}
如果 &val1
是 0x7fff55e54a8c
,那么 &val2
会是什么?
在我的机器上是 0x7fff55e549fc
,不应该是 0x7fff55e54a88
或 0x7fff55e54a90
吗?
如果不是,调用内存中的另一个函数会发生什么?
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();
}
这里有一个很好的解释:
void fun(){
int val2 = 0;
}
int main(){
int val1 = 0;
fun();
}
如果 &val1
是 0x7fff55e54a8c
,那么 &val2
会是什么?
在我的机器上是 0x7fff55e549fc
,不应该是 0x7fff55e54a88
或 0x7fff55e54a90
吗?
如果不是,调用内存中的另一个函数会发生什么?
if
&val1
is0x7fff55e54a8c
, 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();
}
这里有一个很好的解释: