zoukankan      html  css  js  c++  java
  • C++内存布局(1)-让new出的两个变量在堆上的地址连续

    大家都知道栈的地址按照从高到低的顺序增长的,

    而堆的地址是按照从底到高的顺序增长的。

    int *n1 = new int(1);
    int *n2 = new int(2);
    cout<<"n1,n2所指的地址:" << n1 << "  " << n2<<" " <<"相差:"<<(int)n1-(int)n2<<endl;
    cout << "n1,n2的地址    :" << &n1 << "  " << &n2 <<" "<<"相差:"<< (int)&n1 - (int)&n2 << endl;
    cout << sizeof(int*) << endl;

    n1和n2是储存在栈上的

    而它们所指的空间是位于堆上的

    这里我发现在VS2013 debug模式下的结果是,n2和n1相差了12而不是8

    image_thumb[2]

    观察内存布局我发现

    image_thumb[4]

    n1和n2之间隔了很多cc,查阅后发现是为了越界之后,造成软中断方便调试之用的。运行下面的程序可以发现产生了一个中断(触发断点)

    int main()
    {
        //嵌入汇编
        //int表示触发软中断,3是中断号,
        //代码int 3在内存中刚好是一个字节CC
        __asm int 3;
        return 0;
    }

    切换到release下发现

    image_thumb[5]

    n1和n2之间差的值变成了8

    *这里n1比n2地址小的原因是

    多核CPU经常会并行同时运行一些没有因果关系的语句,n2申请空间时没有使用n1的数据,编译器就可以优化成先申请n2,再申请n1,或先申请n1,再申请n2,或者两个并行同时申请(感谢群里的C++大神指点)。

    可以看到栈的增长是按照从高到的低的顺序

    而堆的增长是按照从低到高的顺序

    同时我们也可以看成栈分配的内存是连续的

    而堆的分配的内存是不连续的

    哪我们有没有办法使堆的分配在两个连续的内存上呢?

    方法是我们可以先分配一个大的内存

    然后再这块内存上进行我们的操作

    void *p1 = malloc(2 * sizeof(int));
    void *p2=(int*)p1 + 1;
    int *t1 = new (p1)int(1);
    int *t2 = new (p2)int(2);
    cout << "t1,t2所指的地址:" << t1 << "  " << t2 << endl;
    cout << "t1,t2的地址    :" << &t1 << "  " << &t2 << endl;

    我们先用malloc分配出一块大小为两个int的内存

    这时p1指向这块内存的起点

    我们再将p1移动int个大小的内存得到了p2

    然后分别在p1和p2所指的地址上构建变量

    这样就使的new出的两个变量在堆上的地址连续了

    debug下

    image_thumb[7]

    release下

    image_thumb[6]

    栈(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。分配方式类似于数据结构中的栈。

    堆(heap) — 由程序员分配释放, 若程序员不释放,程序结束时由OS回收 。分配方式倒是类似于链表。

    int *t1 = new (p1)int(1) — 重载operator new 的一个标准、全局的版本,原型是void *operator new( size_t, void *p ) throw() { return p; }在p所指的地方分配内存

  • 相关阅读:
    攻防一体 暴力攻击
    新的亮眼的但不彻底的交互
    利用物联网或智能化区分产品
    Character Sets, Collation, Unicode :: utf8_unicode_ci vs utf8_general_ci
    容灾 RPO RTO
    微信找人代付 下单账号 支付账号
    微信公众号 openId 支付 php中file_get_contents与curl性能比较分析
    t
    accesstoken 中控服务器 并发刷新 加并发锁
    a
  • 原文地址:https://www.cnblogs.com/magicsoar/p/3631936.html
Copyright © 2011-2022 走看看