c/c++内存对齐

今天本来想着了解一下栈和堆是个什么鬼,结果写了个小例子就发现不对劲,按照网上各种博客上说的,临时变量存放在栈内存区,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值