void fun(){
int val2 = 0;
}
int main(){
int val1 = 0;
fun();
}
if &val1
is 0x7fff55e54a8c
,&val2
會是什麼? 在我的機器上它是0x7fff55e549fc
,不應該是0x7fff55e54a88
或0x7fff55e54a90
?如果不是,在內存中調用另一個函數時會發生什麼?主函數和其他函數在C++中使用相同的堆棧空間嗎?
void fun(){
int val2 = 0;
}
int main(){
int val1 = 0;
fun();
}
if &val1
is 0x7fff55e54a8c
,&val2
會是什麼? 在我的機器上它是0x7fff55e549fc
,不應該是0x7fff55e54a88
或0x7fff55e54a90
?如果不是,在內存中調用另一個函數時會發生什麼?主函數和其他函數在C++中使用相同的堆棧空間嗎?
if
&val1
is0x7fff55e54a8c
,&val2
會是什麼?
在C++標準法規中沒有辦法預測它。
所有的功能共享相同的堆棧空間,除非你有線程局部變量。
對於函數調用,可能會放置堆棧幀操作,因此無法預測實際放置在共享堆棧上的方式的關係。
根據C++標準定義,您可以對某些地址進行假設。
每個線程都有一個保留的堆棧空間,在你的情況下,兩個函數都在同一個線程中運行,因此它們都使用相同的堆棧空間。
在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 stackoverflow.
char abusive_stack_usage[200'000];
}
在下面的例子我們沒有得到一個計算器。
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();
}
這依賴於幾乎你沒有指定一切。 –
你不能依賴這裏的任何東西。如果優化器內聯函數,他們幾乎肯定會共享相同的堆棧空間。真正的問題是,你爲什麼在意?你究竟在做什麼*試圖做什麼? –
C++對你來說是錯誤的語言。你真的想用匯編編寫。 –