【问】WIndows下C++局部变量在内存中的分布问题

原本是为了看看C++对象模型中子对象赋值给一个父对象和父类型指针指向的域时,到底会不会切割,就打开codebloks写了下面的代码,编译器选的是GNU。

 1 #define DEBUG(X) std::cout<<#X"\t=\t"<<X<<std::endl;
 2
 3 class A
 4 {
 5 public:
 6     int a;
 7     A():a(1){}
 8 };
 9
10 class B
11 {
12 public:
13     A oa;
14     int b;
15     B():b(2){}
16 };
17
18 main()
19 {
20     B ob;
21     A oa;//=ob.oa;
22     int *p = 0;
23     p = (int *)&oa;
24     DEBUG(&ob);
25     DEBUG(&oa);
26     DEBUG(&p);
27 }

打印出来的局部变量的地址的排列,从大地址到小地址是:ob,p,oa, 把DEBUG(&p)去掉之后排列又恢复正常了(ob, pa, p)。然后程序放在Linux下用g++编译,出来的结果也是正常的。

已在博问里提问,怕忘记这件事就记载在博客里。静候大侠答复~

时间: 2024-08-06 16:01:33

【问】WIndows下C++局部变量在内存中的分布问题的相关文章

面试经常问的C语言变量在内存中的分布(VC6.0)

C/C++变量在内存中的分布在笔试时经常考到,虽然简单,但也容易忘记,因此在这作个总结,以加深印象. 一: #include <stdio.h> #include <malloc.h> int g_i = 100; int g_j = 200; int g_k, g_h; int main() { const int MAXN = 100; int *p = (int*)malloc(MAXN * sizeof(int)); static int s_i = 5; static i

【转】全局变量与局部变量在内存中的区别详细解析

转自:http://www.jb51.net/article/42012.htm 作者: 字体:[增加 减小] 类型:转载 时间:2013-10-11 我要评论 以下是对全局变量与局部变量在内存中的区别进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 一.预备知识-程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 由编译器自动分配释放,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) - 一般

Windows下使用GetGlyphOutline在OpenGL中渲染字体

欢迎转载,请标明出处:http://blog.csdn.net/tianyu2202/ 无图无JB,先上图.使用OpenGL绘制字体,支持多种字体,支持TrueType轮廓字体,支持自选字体纹理大小和输出大小,支持在三维空间内绘制. 关于OpenGL中字体的显示网上其实有很多的教程,不过经常用到的方式有比较简单的Bitmap方式.比较复杂的FreeType方式.而本文介绍的方式虽然只能在Windows下实现,却有着和FreeType一样的显示效果,最重要的是非常简单,仅仅200多行代码即可实现.

Golang调用windows下的dll动态库中的函数

Golang调用windows下的dll动态库中的函数 https://blog.csdn.net/xuduorui/article/details/78943331 原文地址:https://www.cnblogs.com/yuanjiangw/p/12196004.html

内存管理--程序在内存中的分布

在多任务操作系统中的每一个进程都运行在一个属于它自己的内存沙盘中.这个沙盘就是虚拟地址空间(virtual address space). 1 32位虚拟内存布局 在32位模式下虚拟地址空间总是一个4GB的内存地址块.这些虚拟地址通过页表(page table)映射到物理内存,页表由操作系统维护并被处理器引用.每一个进程拥有一套属于它自己的页表,但是还有一个隐情.只要虚拟地址被使用,那么它就会作用于这台机器上运行的所有软件,包括内核本身.因此一部分虚拟地址必须保留给内核使用: 图 1 这并不意味

程序在内存中的分布

转载,原文地址:http://blog.csdn.net/hackbuteer1/article/details/6786811 在现代的操作系统中,当我们说到内存,往往需要分两部分来讲:物理内存和虚拟内存.从硬件上讲,虚拟空间是CPU内部的寻址空间,位于MMU之前,物理空间是总线上的寻址空间,是经过MMU转换之后的空间. 一般我们所说的程序在内存中的分布指的就是程序在虚拟内存中的存储方式. 从低地址到高地址,可分为下面几段: 预留内存地址(操作系统维护的内存地址,不可访问) 程序代码区(只读,

redis在windows下配置和在.net中的使用

一.什么是redis redis是一个开源的,使用C语言编写的面向键值对类型的分布式Nosql数据库系统,功能类似Memcache,但比Memcache功能更丰富. redis与Memcache的不同点: 支持持久化.主从复制:支持的类型多: Memcache通过客户端驱动实现的集群,存储的时候通过算法来决定把值存在哪一台服务器中. redis做集群与Memcach不同,每一个redis服务器都有一个完整的副本. redis支持的数据类型有5种: string      :   key为stri

Windows下Memcached在.Net程序中的实际运用(从Memcached客户端Enyim的库的编译到实际项目运用) 转发

1.一点基础概念 2.获取EnyimMemcached客户端的源代码并编译出动态库 3.Memcached的服务器安装(windows server) 4.在web项目中实战 一.基础概念 memcached是什么?memcached是分布式缓存系统,特点是高性能.分布式内存缓存系统.memcached能做什么?用来给动态web提升响应速度(通过缓存数据,减少数据库访问压力).为什么要用memcached?笔者认为使用它的原因是能提升网站整体性能,减少数据库的的请求压力.据某位博主说合理使用Me

windows下监控vpn状态及中断后自启动

windows服务器vpn远程到内网与内网主机通信,因vpn客户端或其它原因,vpn链接会不定期中断,导致与内网通信中断,中断时不清楚vpn进程是否结束,解决思路如下,前提是客户端启动后会自动拨号链接    判断vpn进程是否存在-->判断与vpn服务器是否为链接状态,若否则启动vpn程序,vpn.bat脚本内容如下    @echo off    关闭回显    c:    切换到vpn客户端所在分区    cd C:\Program Files (x86)\vpn\SSL\vpnClient