C++内存布局(1)-让new出的两个变量在堆上的地址连续
大家都知道栈的地址按照从高到低的顺序增长的,
而堆的地址是按照从底到高的顺序增长的。
int *n1 = new int();
int *n2 = new int();
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

观察内存布局我发现

n1和n2之间隔了很多cc,查阅后发现是为了越界之后,造成软中断方便调试之用的。运行下面的程序可以发现产生了一个中断(触发断点)
int main()
{
//嵌入汇编
//int表示触发软中断,3是中断号,
//代码int 3在内存中刚好是一个字节CC
__asm int ;
return ;
}
切换到release下发现

n1和n2之间差的值变成了8
*这里n1比n2地址小的原因是
多核CPU经常会并行同时运行一些没有因果关系的语句,n2申请空间时没有使用n1的数据,编译器就可以优化成先申请n2,再申请n1,或先申请n1,再申请n2,或者两个并行同时申请(感谢群里的C++大神指点)。
可以看到栈的增长是按照从高到的低的顺序
而堆的增长是按照从低到高的顺序
同时我们也可以看成栈分配的内存是连续的
而堆的分配的内存是不连续的
哪我们有没有办法使堆的分配在两个连续的内存上呢?
方法是我们可以先分配一个大的内存
然后再这块内存上进行我们的操作
void *p1 = malloc( * sizeof(int));
void *p2=(int*)p1 + ;
int *t1 = new (p1)int();
int *t2 = new (p2)int();
cout << "t1,t2所指的地址:" << t1 << " " << t2 << endl;
cout << "t1,t2的地址 :" << &t1 << " " << &t2 << endl;
我们先用malloc分配出一块大小为两个int的内存
这时p1指向这块内存的起点
我们再将p1移动int个大小的内存得到了p2
然后分别在p1和p2所指的地址上构建变量
这样就使的new出的两个变量在堆上的地址连续了
debug下

release下

栈(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。分配方式类似于数据结构中的栈。
堆(heap) — 由程序员分配释放, 若程序员不释放,程序结束时由OS回收 。分配方式倒是类似于链表。
int *t1 = new (p1)int(1) — 重载operator new 的一个标准、全局的版本,原型是void *operator new( size_t, void *p ) throw() { return p; }在p所指的地方分配内存
C++内存布局(1)-让new出的两个变量在堆上的地址连续的更多相关文章
- JVM内存布局
1. 概述 对于从事c和c++程序开发的开发人员来说,在内存管理领域,他们既拥有最高权力的”皇帝“又是从事最基础工作的”劳动人民“---既拥有每个对象的”所有权“,又担负着每个对象开始到终结的维护责任 ...
- 图文详解Java对象内存布局
作为一名Java程序员,我们在日常工作中使用这款面向对象的编程语言时,做的最频繁的操作大概就是去创建一个个的对象了.对象的创建方式虽然有很多,可以通过new.反射.clone.反序列化等不同方式来创建 ...
- c++对象内存模型【内存布局】(转)
总结:1.按1继承顺序先排布基于每个父类结构.2.该结构包括:基于该父类的虚表.该父类的虚基类表.父类的父类的成员变量.父类的成员变量.3.多重继承且连续继承时,虚函数表按继承顺序排布函数与虚函数.4 ...
- C++的菱形继承会发生什么问题?如何解决?画出其内存布局图
菱形继承问题样例: #include <iostream> using namespace std; class A { public: ; virtual int getx() { re ...
- 图说C++对象模型:对象内存布局详解
0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看. 本文的结论都在VS2013上得到验证.不同的编译器在内存布局的细节上可能有 ...
- C++ 系列:内存布局
转载自http://www.cnblogs.com/skynet/archive/2011/03/07/1975479.html 为什么需要知道C/C++的内存布局和在哪可以可以找到想要的数据?知道内 ...
- C++ Data Member内存布局
如果一个类只定义了类名,没定义任何方法和字段,如class A{};那么class A的每个实例占用1个字节的内存,编译器会会在这个其实例中安插一个char,以保证每个A实例在内存中有唯一的地址,如A ...
- C++中派生类对象的内存布局
主要从三个方面来讲: 1 单一继承 2 多重继承 3 虚拟继承 1 单一继承 (1)派生类完全拥有基类的内存布局,并保证其完整性. 派生类可以看作是完整的基类的Object再加上派生类自己的Objec ...
- C++ 多继承和虚继承的内存布局(转)
转自:http://www.oschina.net/translate/cpp-virtual-inheritance 警告. 本文有点技术难度,需要读者了解C++和一些汇编语言知识. 在本文中,我们 ...
随机推荐
- 接口与协议学习笔记-AMBA片上通信协议_APB_AHB_AXI_AXI4不同版本(二)
随着深亚微米工艺技术日益成熟,集成电路芯片的规模越来越大.数字IC从基于时序驱动的设计方法,发展到基于IP复用的设计方法,并在SOC设计中得到了广泛应用.在基于IP复用的SoC设计中,片上总线设计是最 ...
- tomcat启动慢?自己动手打造轻量web服务器(一)
废话少说,直接上代码. 编程语言:kotlin import java.net.ServerSocketimport java.net.Socket fun main(args:Array<St ...
- 第五周 加分题-mybash的实现
第五周 加分题-mybash的实现 使用fork,exec,wait实现mybash 产品代码 #include <stdio.h> #include <stdlib.h> # ...
- BZOJ1190_梦幻岛宝珠_KEY
题目传送门 观察数据a*2^b,转化成二进制后,后面跟了b位的0,可以转化为一个分层背包. 先预处理出每个物品是哪一层的,并放在同层内DP. 同层内直接背包,考虑层与层之间的DP. 第一维枚举层数,然 ...
- PostgreSQL的backuplabel file 初步学习
磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面:PostgreSQL内部结构与源代码研究索引页 回到顶级页面:PostgreSQL索引页 看代码: /* File path names ...
- [agc008E]Next or Nextnext-[dp+思考题]
Description 传送门 Solution 官方题解 然后我谈下个人理解.由于我们的两个条件只要任意满足,则在p的图中i有两种连边法:i->p[i],i->p[p[i]]. 我们考虑 ...
- pythonDjango开发-创建django程序
1.创建jgango程序 a.命令 cmd命令行下 进入到需要创建项目的路径下 django-admin startproject mysite 创建项目 cd mysite 进入项目文件夹 pyt ...
- MIUI 10 已连接 但无法访问互联网 的解决方案
wifi为 DHCP 时,我发现得到的总是已经有机器在用的 192.168.1.9 这台机器, 所以只需要手动配置一下ip就行了,随便指定一个,然后ping一下,ping不通的话就配上,然后再重新连 ...
- wget和curl方式下载JDK
有时候我们需要在Linux服务器上安装Oracle JDK,这时候我们发现直接复制网页上面的地址是不能下载的 以下载jdk-8u101-linux-i586.tar.gz为例,右键查看到的地址为htt ...
- SSIS 变量、参数和表达式
动态包对象包括变量,参数和表达式.变量主要为包提供一种对象之间相互通信的方法,变量的值是可以更新的.而参数不同于变量,参数的值在包中是不能修改的,只能通过外部来设置参数.表达式可以引用变量.参数.常量 ...