查看原文
其他

如何用计算机语言理解int i =3

2017-04-27 于亚豪 终端研发部
前言介绍

当我们开始写入 int = 3的时候,计算机究竟做了那些事情呢,今天我们就来简单的探究一下

正文


当我们在java代码中或在c/c++中定义一个变量比如: int i= 3,如果我们以计算机的角度来,做了以下事情:

  • 申请了一块内存,其大小为4个byte

  • 给这一块内存空间如(0x223cff)起了一个名字,这里要注意的是此时的i只是给程序员看的

  • 把这个int数据类型的3存放到i这个内存控件里面(0x223cff)

  • int i创建出来----》用于存放int数据类型

  • 比如 double d 来存放double类型的数据

如何打印java中打印变量地址

设置因为导入import sun.misc.Unsafe;引起的错误 

Unsafe

Java为什么会引入及如何使用Unsafe

Unsafe简介

un.misc.Unsafe至少从2004年Java1.4开始就存在于Java中了。在Java9中,为了提高JVM的可维护性,Unsafe和许多其他的东西一起都被作为内部使用类隐藏起来了。但是究竟是什么取代Unsafe不得而知,个人推测会有不止一样来取代它,那么问题来了,到底为什么要使用Unsafe?

做一些Java语言不允许但是又十分有用的事情

很多低级语言中可用的技巧在Java中都是不被允许的。对大多数开发者而言这是件好事,既可以拯救你,也可以拯救你的同事们。同样也使得导入开源代码更容易了,因为你能掌握它们可以造成的最大的灾难上限。或者至少明确你可以不小心失误的界限。如果你尝试地足够努力,你也能造成损害。

那你可能会奇怪,为什么还要去尝试呢?当建立库时,Unsafe中很多(但不是所有)方法都很有用,且有些情况下,除了使用JNI,没有其他方法做同样的事情,即使它可能会更加危险同时也会失去Java的“一次编译,永久运行”的跨平台特性。

对象的反序列化

当使用框架反序列化或者构建对象时,会假设从已存在的对象中重建,你期望使用反射来调用类的设置函数,或者更准确一点是能直接设置内部字段甚至是final字段的函数。问题是你想创建一个对象的实例,但你实际上又不需要构造函数,因为它可能会使问题更加困难而且会有副作用。

在这个类中,应该能够重建和设置final字段,但如果你不得不调用构造函数时,它就可能做一些和反序列化无关的事情。有了这些原因,很多库使用Unsafe创建实例而不是调用构造函数。

Unsafe unsafe = getUnsafe();
Class aClass = A.class;
A a = (A) unsafe.allocateInstance(aClass);

线程安全的直接获取内存

当你分别在两个程序,一个输入odd一个输入even,中运行时,可以看到两个进程都是通过持久化共享内存交换数据的。

在每个程序中,将相同的磁盘缓存映射到进程中。内存中实际上只有一份文件的副本存在。这意味着内存可以共享,前提是你使用线程安全的操作,比如volatile变量和CAS操作。(译注:CAS Compare and Swap 无锁算法)

在两个进程之间有83ns的往返时间。当考虑到System V IPC(进程间通信)大约需要2500ns,而且用IPC volatile替代persisted内存,算是相当快的了。

在C语言中如何去获取内存地址呢

int i = 3;int* p;np = &i;
printf("i的内存地址为: 0x%xn",p);
printf("i=%dn",i);
printf("i=%dn",*p);
//注意这里是把内存地址p中的数据给取出来

最近在研究dnk,这里简单的总结一些如何内存地址。

如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809   

微信公众号:终端研发部


            

Hello,伙伴们

长按二维码就可以关注我们啦




您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存