#include <stdio.h>
#include <stdlib.h>
int nGlobal = 100;
int main(void )
{
char *pLocalString1 = "LocalString1";
const char *pLocalString2 = "LocalString2";
static int nLocalStatic = 100;
int nLocal = 1;
const int nLocalConst = 20;
int *pNew = new int[5];
char *pMalloc = (char *)malloc(1);
//全局变量(nGlobal)、静态变量和局部的静态变量(nLocalStatic)
printf("global variable: 0x%x ", &nGlobal);
printf("static variable: 0x%x ", &nLocalStatic);
printf("local expression 1: 0x%x ", pLocalString1);
printf("local expression (const) : 0x%x ", pLocalString2);
//堆内存
printf(" ");
printf("new: 0x%x ", pNew);
printf("malloc: 0x%x ", pMalloc);
printf(" ");
printf("local pointer(pNew): 0x%x ", &pNew);
printf("local pointer(pLocalString2): 0x%x ", &pLocalString2);
printf("local pointer(pLocalString1): 0x%x ", &pLocalString1);
printf("local variable(nLocal): 0x%x ", &nLocal);
printf("local pointer(pMalloc): 0x%x ", &pMalloc);
printf("local const variable: 0x%x ", &nLocalConst);
return 0;
}输出为: global variable: 0x417000 static variable: 0x417004 local expression 1: 0x4158d4 local expression (const) : 0x4158c4
new: 0x32a10 malloc: 0x32a50 //边界对齐通过New申请了5个整数需要的内存,通过 malloc申请了1个字节。这里的地址相差32个字节,如果按正常算应该是20个字节为0x14,malloc申请地址应该从new后的20个字节 32a24开始,但占据32个字节的内存(0x32a10~0x32a50),即在内存分配时按16个字节对齐。
local pointer(pNew): 0x13ff30 local pointer(pLocalString2): 0x13ff54 local pointer(pLocalString1): 0x13ff60 local variable(nLocal): 0x13ff48 local pointer(pMalloc): 0x13ff24 local const variable: 0x13ff3c
内存对齐方式虽然浪费一些内存,但由于CPU在对齐方式下运行比较快,简化了处理器和存储器系统之间接口的硬件设计。如,假设处理器总是从存 储器中取8个字节出来,则地址必须为8的倍数。如果我们能合保证所有的double都将它们的地址对齐成8的倍数,那么就可以用一个存储器操作来读或写值 了。否则,我们可能需要执行两次存储器访问,因为对象可能分放在两个8字节存储器块中。
本文详细介绍了C++程序中对象模型的基本概念,包括程序使用的内存区域划分,如全局(静态)数据区、常量数据区、代码区、栈和堆等,并通过示例代码展示了不同类型数据在内存中的分布。


被折叠的 条评论
为什么被折叠?



