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++和一些汇编语言知识. 在本文中,我们 ...
随机推荐
- 复制web项目时注意修改web项目名
改web项目的项目名可以右击->properties->搜索web找到settings->修改context name
- JavaWeb基础—MySQL入门小结
一.数据库概述 RDBMS:关系型数据库管理系统 == 管理员(manager)+仓库(database) 常见数据库: Oracle(神喻):甲骨文 MySQL: 归于甲骨文旗下(高版本系统已经开 ...
- 25-[jQuery]-ajax
1.什么是AJAX AJAX = 异步的javascript和XML(Asynchronous Javascript and XML) 简言之,在不重载整个网页的情况下,AJAX通过后台加载数据,并在 ...
- idea ssm项目出现日志中文乱码,封装的json中的msg字段中文乱码(但是json封装的bean中的字段不乱码)等其他各种项目下的中文乱码解决方案
开头划重点!(敲黑板):rebuild和mvn package的循环往复好几次的操作是解决这个问题的最主要的方法! 经过多次试验,发现这样做就可以正常显示中文了 我说为什么有时候乱码,有时候中文正常, ...
- 第一道防线__SpringMVC配置拦截器
这几天在公司自己开发一个小系统,但是系统的安全性也得考虑,起初没注意,赶急就光关心业务逻辑和实现效果.最后老大一出手,就把最严重的问题指出来了,他说你这根本没安全性可言,于是我试着将公司使用的spri ...
- js,jsp里将数据库Date类型获取出来后格式化显示于界面
js:new Date(rowdata.updateTime).format("yyyy-MM-dd hh:mm:ss") jsp: <fmt:formatDate valu ...
- Macaca上手体验
在研究了一段时间Appium后,尝试对另一个框架做实验——Macaca,阿里的开源测试框架,该框架不只适合移动端,同样适用于web端,可谓是方便的很啊~ 同时支持js.java.python.封装好的 ...
- [翻译] Python 3.5中async/await的工作机制
Python 3.5中async/await的工作机制 多处翻译出于自己理解,如有疑惑请参考原文 原文链接 身为Python核心开发组的成员,我对于这门语言的各种细节充满好奇.尽管我很清楚自己不可能对 ...
- leetcode_11. Container With Most Water
leetcode_11. Container With Most Water 一,问题: Given n non-negative integers a1, a2, ..., an, where ea ...
- 第1章 Linux命令行简介
1.1 Linux命令行概述 1.2 在Linux命令行下查看命令帮助 1.3 Linux关机.重启.注销命令 1.4 老男孩的运维思想 1.1 Linux命令行概述 1.1.1 Linux命令行的作 ...