看到了这张图
网上有一种解释是栈的递减是对函数说的。
于是我用相同的代码在 Linux 和 Windows 上跑了下
#include <iostream>
using namespace std;
void f1()
{
printf("f1\n");
}
void f2()
{
printf("f2\n");
}
int main()
{
auto it1 = f1;
auto it2 = f2;
printf("%p %p\n", it1, it2);
int* p1 = new int;
int* p2 = new int;
printf("%p %p\n", p1, p2);
return 0;
}
Windows 上的结果是这样的
00007FF63D4A1181 00007FF63D4A11FE
000001C1C6615F50 000001C1C6615820
Linux上的结果是这样的
0x563045b0c81a 0x563045b0c82d
0x563047acf280 0x563047acf2a0
可以发现栈在Windows上增,在Linux上增;堆在Win上减,在Linux上增
所以虚拟地址怎么呈现给用户是编译器的事情