理解各种数据类型和简单类的内存存放.

基本数据类型.int ,char short.

int a;
a 标签代表一个地址的数据,里面的数据类型是int.所以占4个字节.
a=3;
给基本数据类型的标签赋直.就等于给标签代表的地址的数据赋直.
a 标签既然代表一个地址的数据,那么它的地址用&a来获得.
&a: 0x22ff1c: 03 00 00 00
&(&a)会错误.因为&a并不是内存某个地方.

数组类型.

int a[3]
首先,a[0],a[1],a[2] 和基本数据类型一样理解.
a[0] 标签代表一个地址的数据,里面的数据类型是int.所以占4个字节.
所以同上有&(a[0]),&(a[1])
&(a[0]):0x22ff04

到这里可以不再需要知道额外的知识了.数据和地址都可以得到了.

本来a本身没有任何意义了.

但是 &(a[0]) ,代表的首地址对于程序来说作用太大.传参,返回,等等.
所以用a来代表&(a[0]),a+1代表&(a[1])
但是a是地址常量.很多情况想把a改为其他直,以至于出来了指针,相当于把a这个地址常量再放入内存中,用一个(类型 *)的类型来表示.

就是指针类型了.不准确的理解其实就是一个2个字节的地址,存放了一个可变数组的首地址.

指针类型.

char * a="ag!";
首先,a[0],a[1],a[2], *a, *(a+1),*(a+2) 和基本数据类型一样理解.

所以同上有&(a[0]),&(a[1]) a, a+1

*a 标签代表一个地址的数据,里面的数据 占4个字节.存放的是首地址.
定义必须是(类型 * a) .因为只有首地址不行.必须知道存放的是什么类型.取多少字节组成一个数据.

a 标签和数组类型标签类试,代表第一个数据的地址.
c:0x403024

&a 表示 首地址存放的地址.

class a;
类的标签的含义和数组类试.只不过不用下标,而用.
a.name a.sex 和基本数据类型一样理解.
所以
&a.isbn: 0x22ff18
如果是简单的类,那么第一个数据的地址就是,类的地址
&a:0x22ff18

直类型做行参.
void change(Sales_item b)
会把类的成员变量作为参数全部入栈. 当然就不会修改函数外对象.

movb $0x62,0x18(%esp)
0x00401347 movl $0x3,0x1c(%esp)
0x0040134F mov 0x18(%esp),%eax//
0x00401353 mov 0x1c(%esp),%edx
0x00401357 mov %eax,(%esp)//类的数据成员入栈
0x0040135A mov %edx,0x4(%esp)//类的数据成员入栈
0x0040135E call 0x40136a <change(Sales_item)>

引用类型
void change(Sales_item &b)

0x00401342 movb $0x62,0x14(%esp)
0x00401347 movl $0x3,0x18(%esp)
0x0040134F lea 0x14(%esp),%eax//注意lea指令.这里是把地址入栈. 而且是类对象的第一个数据成员的地址,应该就是类的地址.
0x00401353 mov %eax,(%esp)
0x00401356 call 0x40136a <change(Sales_item&)>

时间: 2024-10-09 06:56:41

理解各种数据类型和简单类的内存存放.的相关文章

虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte

#include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout << "A:A" <<endl; } virtual void getb(){ cout << "A:B" <<endl; } }; class B :public A{ public: B(){} virtual void g

Java基础系列1:深入理解Java数据类型

Java基础系列1:深入理解Java数据类型 当初学习计算机的时候,教科书中对程序的定义是:程序=数据结构+算法,Java基础系列第一篇就聊聊Java中的数据类型. 本篇聊Java数据类型主要包括四个内容: Java基本类型 Java封装类型 自动装箱和拆箱 封装类型缓存机制 Java基本类型 Java基本类型分类.大小及表示范围 Java的基本数据类型总共有8种,包括三类:数值型,字符型,布尔型,其中 数值型: 整数类型:byte.short.int.long 浮点类型:float.doubl

深入理解JavaScript数据类型

javascript中的数据类型分为两类:原始类型和对象类型.其中原始类型包括Undefined.Null.Boolean.Number和String,除开这几种类型以外的就是对象类型. null类型 null是javascript语言中的关键字,它表示一个特殊值,常用来表示“空值”,对null执行typeof操作符,结果返回字符串“object”,也就是说,可以将null认为是一个特殊的对象值,含义是“非对象”.但实际上,通常认为null是他自有类型的唯一成员,他可以表示数字,字符串和对象是“

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

深刻理解Python中的元类

译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得不太明白,希望大家可以给出一些实际的例子和代码片段以帮助理解,以及在什么情况下需要进行元编程.于是e-satis同学给出了神一般的回复,该回复获得了985点的赞同点数,更有人评论说这段回复应该加入到Python的官方文档中去.而e-satis同学本人在Stack Overflow中的声望积分也高达6

深刻理解Python中的元类(metaclass)以及元类实现单例模式

深刻理解Python中的元类(metaclass)以及元类实现单例模式 在看一些框架源代码的过程中碰到很多元类的实例,看起来很吃力很晦涩:在看python cookbook中关于元类创建单例模式的那一节有些疑惑.因此花了几天时间研究下元类这个概念.通过学习元类,我对python的面向对象有了更加深入的了解.这里将一篇写的非常好的文章基本照搬过来吧,这是一篇在Stack overflow上很热的帖子,我看http://blog.jobbole.com/21351/这篇博客对其进行了翻译. 一.理解

VS中的类的内存分布(上)

0.序 目前正在学习C++中,对于C++的类及其类的实现原理也挺感兴趣.于是打算通过观察类在内存中的分布更好地理解类的实现.因为其实类的分布是由编译器决定的,而本次试验使用的编译器为VS2015 RC,所以此处的标题为<VS中的类的内存分布>. 1.对无继承类的探索 1.1 空类 我们先一步一步慢慢来,从一个空的类开始. //空类 class test { }; int main(int argc, char *argv[]) { test ts; cout << sizeof(t

各种数据类型在jvm里的内存分配

jvm运行时数据区的简单介绍 JVM所管理的内存分为以下几个运行时数据区:程序计数器.Java虚拟机栈.本地方法栈.Java堆.方法区. 其中本文涉及到的主要有:java虚拟机站(简称java栈),java堆和方法区. 这里简单地普及一下这三种数据区的知识,java栈的读取速度是最快的(紧次与CPU的寄存器,跨平台性比寄存器好,android使用的是寄存器),但是里面的数据内存大小是编译时就已经分配好的,在运行时都不会改变:java堆的速度没有java栈的速度那么快,但是java堆里面的数据内存

C++类对象内存布局(四)

测试系统:Windows XP 编译器:VS2008 (四) 虚继承的情况: 如果说没有虚函数的虚继承只是一个噩梦的话,那么这里就是真正的地狱.这个C++中最复杂的继承层次在VC上的实现其实我也没有完全理解,摸爬滚打了一番也算得出了微软的实现方法吧,至于一些刁钻的实现方式我也想不到什么理由来解释它,也只算是知其然不知其所以然吧. 也还是从最简单的开始,我们分2个阶段来探讨.一个是有虚函数的派生类虚继承了没有虚函数的基类的情况,一个情况是有虚函数的派生类虚继承了有虚函数的基类的情况. 从第一个开始