今天本来想着了解一下栈和堆是个什么鬼,结果写了个小例子就发现不对劲,按照网上各种博客上说的,临时变量存放在栈内存区,new出来的变量存放在堆内存区,这两点没有问题。但是程序跑起来之后发现栈内的变量却没有被分配到连续的内存。
测试的步骤
测试程序: stack_heap.cpp
/**
* test code: stack_heap.cpp
*/
#include <stdio.h>
int main()
{
// c1和c2被分配到栈上
char c1 = 'a';
char c2 = 'b';
// p被分配到栈上,但是后面new char是从堆上分配的空间
char *p = new char[3];
p[0] = 'c';
p[1] = 'd';
p[2] = 'e';
printf("&c1: %p\n", &c1);
printf("&c2: %p\n", &c2);
printf("&p: %p\n", &p);
printf("&p[0]: %p\n", &p[0]);
return 0;
}
测试环境: linux x86 little endian
预期执行结果:
&c1: 0x7fff5a0c60af
&c2: 0x7fff5a0c60ae
&p: 0x7fff5a0c60ad
&p[0]: 0x949010
编译 && 执行:
g++ -g stack_heap.cpp -O0 -o stack_heap && ./stack_heap
实际执行结果:
p与c2之间间隔着11个字节,并没有按照预期那样连续分配栈内存给p,然后我又往程序中char c2和char *p之间增加了几次char cn…变量,发现p与cn直接的间隔字节数会变小。突然想起struct内存对齐,该不会除了struct之外的函数、类也会出现内存对齐的情况吧?
随后在网上翻了一下资料,确实是不光结构体存在内存对齐,所有的变量在内存中都会进行对齐。现在还没有学到这么深入,先大概了解一下,以后再深入看一下。
下面是我查询到的一些资料:
基础:http://zhangyu.blog.51cto.com/197148/673792/
高级:http://lc7cl.iteye.com/blog/1250481