您的位置:首页 > 编程语言 > C语言/C++

c/c++内存对齐

2015-08-25 20:04 441 查看
今天本来想着了解一下栈和堆是个什么鬼,结果写了个小例子就发现不对劲,按照网上各种博客上说的,临时变量存放在栈内存区,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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  内存对齐