C#指针内存控制Marshal内存数据存储原理是什么


本篇内容介绍了“C#指针内存控制Marshal内存数据存储原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、内存是由 Key 和 Value 组成,Key 是内存地址、Value 是存储的数据;2、Key:是一个32位长度的二进制数;(64位的程序则是64位长度的二进制)> 32位最大值为二进制 ‭0111 1111 1111 1111 1111 1111 1111 1111‬或十六进制 0x7FFF FFFF,或十进制 2 147 483 647 (2GB) (int.MaxValue);> 在C#程序中由 IntPtr 类型进行存储,常以十六进制数进行交互;3、Value:则是一个8位长度的二进制数;(所以说计算机只能存储 0 和 1 就是这原因)> 最大值为二进制 1111 1111‬,或十六进制 0xFF,或十进制 255;> 也就是 1byte 的数据,所以说计算机最小存储单位为 byte 也正是如此;4、内存组成结构如下:> 二进制:Key (0111 1111 1111 1111 1111 1111 1111 1111‬) = Value (1111 1111)> 十六进制:Key (0x7FFF FFFF) = Value (0xFF)> 十进制:Key (2 147 483 647) = Value (255)> 程序:Key (IntPtr) = Value (byte)1、指针是用于指向一个值类型数据,非想象中的面向过程逻辑、认为第一个读取后会自动指向下一个,哈哈;2、如 int 类型的指针,就是将指定内存地址中的数据转换成 int 数据;3、由于 int 类型长度为32位(4byte),所以指针读取数据时会自动取连续4byte的数据来转换成 int;> 如一个 int 类型值为 123456,假设他的内存地址为 IntPtr(0x014245E0),那么他所占用的内存块则为以下:第1byte:IntPtr(0x014245E0) = byte(0x40)第2byte:IntPtr(0x014245E1) = byte(0xE2)第3byte:IntPtr(0x014245E2) = byte(0x01)第4byte:IntPtr(0x014245E3) = byte(0x00)组成结构为:IntPtr(0x014245E0) = byte[] { 0x40, 0xE2, 0x01, 0x00 }> 那么下一个对象则就从 IntPtr(0x014245E4) 开始,如:IntPtr(0x014245E4) = byte[] { 0x00, 0x00, 0x00, 0x00 };OK,说完原理得开始说代码了,来个华丽的分割线;再声明一下:1、由于 C# 程序中默认是不允许使用不安全代码,如内存控制、指针等操作;2、所以关于非安全操作的代码需要写在 unsafe 语句块中;3、另外还需要设置允许使用不安全代码,如:解决方案 > 选择项目 > 右键 > 属性 > 生成 > [√] 允许不安全代码;“C#指针内免费云主机域名存控制Marshal内存数据存储原理是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!

相关推荐: C++运算符重载和返回值优化的方法

本篇内容介绍了“C++运算符重载和返回值优化的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  编译环境还是针对C6455 DSP,为了做一些简单的图像直方…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 05/15 09:19
下一篇 05/15 09:19

相关推荐