实际C++;Windows上的程序内存布局(VS2010) 最近我读了一些关于C++内存布局的文章,简单地说,我理解有3个主要的部分: 固定内存:代码、全局和静态变量 堆栈内存:本地值和函数值 堆内存:由用户管理的内存(malloc/free new/delete)
根据我读到的帖子,我假设上面的部分分配了一大块内存 为了检查这一点,我创建了一个简单的程序:实际C++;Windows上的程序内存布局(VS2010) 最近我读了一些关于C++内存布局的文章,简单地说,我理解有3个主要的部分: 固定内存:代码、全局和静态变量 堆栈内存:本地值和函数值 堆内存:由用户管理的内存(malloc/free new/delete),c++,visual-studio-2010,memory,layout,C++,Visual Studio 2010,Memory,Layout,根据我读到的帖子,我假设上面的部分分配了一大块内存 为了检查这一点,我创建了一个简单的程序: #include <stdio.h> int g_loopCount; static int gs_one = 1; int getLifeResult(int a) { printf("&a %d\t\t%p\n", g_loopCount, &a); if(++g_loopCount < 4) { getLifeR
#include <stdio.h>
int g_loopCount;
static int gs_one = 1;
int getLifeResult(int a)
{
printf("&a %d\t\t%p\n", g_loopCount, &a);
if(++g_loopCount < 4)
{
getLifeResult(a);
}
else
{
return g_loopCount * 10 + a;
}
}
int main()
{
//fixed
printf("-fixed-\n");
printf("&gs_one\t\t\t%p\n", &gs_one);
g_loopCount = 0;
printf("&g_loopCount\t\t%p\n\n", &g_loopCount);
int* lifeResult = new int(0);
int* lifeResultCopy = new int(0);
//stack
printf("-stack-\n");
printf("&lifeResult\t\t%p\n", &lifeResult);
printf("&lifeResultC\t\t%p\n", &lifeResultCopy);
*lifeResult = getLifeResult(2);
*lifeResultCopy = *lifeResult;
printf("\n");
//heap
printf("-heap-\n");
printf("lifeResult\t\t%p\n", lifeResult);
printf("lifeResultC\t\t%p\n\n", lifeResultCopy);
return *lifeResult;
}
这正常吗?这些块的位置取决于什么:操作系统、编译器?这会发生在每个操作系统上吗?有人能再给我解释一下这个机制吗
谢谢大家! 操作系统主宰一切 首先,现代代码是可重新定位的。几乎所有的操作系统,尤其是Windows,都会在加载程序时动态地计算出程序运行的位置。这对于让DLL一起使用非常重要,但它可以在任何时候发生 看看这个:
此外,您的程序可以使用的堆栈数量可能会发生变化 操作系统主宰一切 首先,现代代码是可重新定位的。几乎所有的操作系统,尤其是Windows,都会在加载程序时动态地计算出程序运行的位置。这对于让DLL一起使用非常重要,但它可以在任何时候发生 看看这个:
此外,您的程序可以使用的堆栈数量可能会发生变化 操作系统主宰一切 首先,现代代码是可重新定位的。几乎所有的操作系统,尤其是Windows,都会在加载程序时动态地计算出程序运行的位置。这对于让DLL一起使用非常重要,但它可以在任何时候发生 看看这个:
此外,您的程序可以使用的堆栈数量可能会发生变化 操作系统主宰一切 首先,现代代码是可重新定位的。几乎所有的操作系统,尤其是Windows,都会在加载程序时动态地计算出程序运行的位置。这对于让DLL一起使用非常重要,但它可以在任何时候发生 看看这个:
此外,您的程序可以使用的堆栈数量可能会发生变化 您可以通过转到项目设置并转到:
Project|Properties|Linker|Advanced|Randomize Base Address
将此项设置为“否(/DYNAMICBASE:No)”
您还可以使用固定基址(/fixed/base)您可以通过转到项目设置并转到:
Project|Properties|Linker|Advanced|Randomize Base Address
将此项设置为“否(/DYNAMICBASE:No)”
您还可以使用固定基址(/fixed/base)您可以通过转到项目设置并转到:
Project|Properties|Linker|Advanced|Randomize Base Address
将此项设置为“否(/DYNAMICBASE:No)”
您还可以使用固定基址(/fixed/base)您可以通过转到项目设置并转到:
Project|Properties|Linker|Advanced|Randomize Base Address
将此项设置为“否(/DYNAMICBASE:No)”
您还可以使用固定基址(/fixed/base)