当前位置:网站首页>C # use Marshall to manually create unmanaged memory in the heap and use
C # use Marshall to manually create unmanaged memory in the heap and use
2022-07-06 19:16:00 【luckyone906】
Use Marshal Make a large array that can quickly free memory .
You need to constantly apply for a large memory array , Then release him , however C# For large memory, it is not released immediately , So there are some performance problems .
In the blog Garden, I saw a great God using Marshal A large array of quick applications , So I learned his way to get one . This article tells you how this class is used
In use , Let's take a look at the original C# Large array performance . You can see that it keeps gc, Poor performance
static void Main(string[] args){for (int i = 0; i < 10000; i++){Foo();}Console.ReadKey();}private static void Foo(){var foo = new byte[1000000000];}
Introduce
In the use of Marshal You need to know what this is , Actually Marshal Is an offer COM Methods of interoperability .
Use
Here's a quick application int Array to tell you how to use .
Do you remember C Application array for ? In fact, the following methods and C In the same
int n = 100000;// lengthIntPtr buffer = Marshal.AllocHGlobal(sizeof(int) * n);
It can be used at this time buffer As an array
Here's his first k Elements modified
IntPtr buffer = Marshal.AllocHGlobal(sizeof(int) * n);int k = 2;IntPtr t = buffer + k * sizeof(int);var p = Marshal.PtrToStructure<int>(t);Console.WriteLine("p " + p); //196713 The value is uncertainp = 2;Marshal.StructureToPtr(p,t,false);p = Marshal.PtrToStructure<int>(t);Console.WriteLine("p " + p);//2// TraverseConsole.WriteLine(" Traverse ");for (int i = 0; i < 10; i++){t = buffer + i * sizeof(int);Console.WriteLine(Marshal.PtrToStructure<int>(t));}
Traverse :
4390931244502144200241357220181196712550912543686656
As you can see from the code above , The two main methods used are StructureToPtr and PtrToStructure , and StructureToPtr Is to write from the specified type to the pointer , I hope you also know how to use pointers ,PtrToStructure Is to start reading data from where the pointer points , Read the specified type of data . So you can go from Marshal Use one type to read from another , However, generally, the type to be read needs to be determined by the type size , Such as char Sure 、string Can not be .
In turn, ,StructureToPtr Is to write the specified type to the specified pointer , It is also necessary to determine the size of this type , If you can write char But you can't write string. This is how to read and write arrays .
So when traversing, what output some strange values , In fact, because there is no initialization , The value inside is uncertain . I think it's good to use this as a random number .
Use Marshal It's safer , because ms Did a lot of processing , But it also causes the program to flash back , Like the following code
private static void Foo(){int n = 100000;// lengthIntPtr buffer = Marshal.AllocHGlobal(sizeof(int) * n);try{var t = buffer + (n * 10) * sizeof(int);var p = Marshal.PtrToStructure<int>(t);}catch (Exception e){Console.WriteLine(e);}Marshal.FreeHGlobal(buffer);}
There will be anomalies System.AccessViolationException, This exception cannot be catch Of , So you'd better encapsulate it when you use it
“System.AccessViolationException” The unhandled exception of type Unknown moduleTrying to read or write to protected memory . This usually indicates that other memory is corrupted
if necessary catch Then please app.config Add the following code
<?xml version="1.0" encoding="utf-8" ?><configuration><runtime><legacyCorruptedStateExceptionsPolicy enabled="true" /></runtime></configuration>
And then in Main Function add HandleProcessCorruptedStateExceptions , Please look at the code.
[HandleProcessCorruptedStateExceptions]static void Main(string[] args){AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;for (int i = 0; i < 100000; i++){try{Foo();}catch (Exception e){Console.WriteLine(e);}}Console.WriteLine(" complete ");Console.ReadKey();}
Then you can see entering UnhandledException , But I can't catch , The software will still crash
Free memory
So how to free memory ? Because this application is not managed , If there is no manual release , Then there is a memory leak .
static void Main(string[] args){for (int i = 0; i < 10000; i++){Foo();}Console.ReadKey();}private static void Foo(){int n = 100000;// lengthIntPtr buffer = Marshal.AllocHGlobal(sizeof(int) * n);}
The above code will soon see that the memory is occupied by 2G, So you need to release it manually
Marshal.FreeHGlobal(buffer);
The original byte Arrays need to use 1G Memory , And it's very slow , Now using this method only needs 7M Memory , fast
So when you need to apply for a large array , Need to keep releasing , You can use this method .
边栏推荐
- 朗坤智慧冲刺科创板:年营收4亿 拟募资7亿
- Some recruitment markets in Shanghai refuse to recruit patients with covid-19 positive
- The nearest library of Qinglong panel
- Solution of commercial supply chain management platform for packaging industry: layout smart supply system and digitally integrate the supply chain of packaging industry
- 关于静态类型、动态类型、id、instancetype
- Yutai micro rushes to the scientific innovation board: Huawei and Xiaomi fund are shareholders to raise 1.3 billion
- Master Xuan joined hands with sunflower to remotely control enabling cloud rendering and GPU computing services
- 三面蚂蚁金服成功拿到offer,Android开发社招面试经验
- Druid 数据库连接池 详解
- 全套教学资料,阿里快手拼多多等7家大厂Android面试真题
猜你喜欢

抽象类与抽象方法

How are you in the first half of the year occupied by the epidemic| Mid 2022 summary

RT-Thread 组件 FinSH 使用时遇到的问题

包装行业商业供应链管理平台解决方案:布局智慧供应体系,数字化整合包装行业供应链

倒计时2天|腾讯云消息队列数据接入平台(Data Import Platform)直播预告

应用使用Druid连接池经常性断链问题分析

openmv4 学习笔记1----一键下载、图像处理背景知识、LAB亮度-对比度

ROS custom message publishing subscription example

Unlock 2 live broadcast themes in advance! Today, I will teach you how to complete software package integration Issues 29-30

Human bone point detection: top-down (part of the theory)
随机推荐
R语言ggplot2可视化:使用ggpubr包的ggviolin函数可视化小提琴图
倒计时2天|腾讯云消息队列数据接入平台(Data Import Platform)直播预告
RedisSystemException:WRONGTYPE Operation against a key holding the wrong kind of value
能源行业的数字化“新”运维
Black Horse - - Redis Chapter
Visual Studio Code启动时提示“Code安装似乎损坏。请重新安装。”、标题栏显示“不受支持”信息的解决办法
The list of people who passed the fifth phase of personal ability certification assessment was published
Openmv4 learning notes 1 --- one click download, background knowledge of image processing, lab brightness contrast
安装Mysql报错:Could not create or access the registry key needed for the...
Druid 数据库连接池 详解
How are you in the first half of the year occupied by the epidemic| Mid 2022 summary
R语言ggplot2可视化时间序列柱形图:通过双色渐变配色颜色主题可视化时间序列柱形图
Handwritten online chat system (principle part 1)
Looting iii[post sequence traversal and backtracking + dynamic planning]
test about BinaryTree
ACTF 2022圆满落幕,0ops战队二连冠!!
Test technology stack arrangement -- self cultivation of test development engineers
R语言dplyr包进行数据分组聚合统计变换(Aggregating transforms)、计算dataframe数据的分组均值(mean)
【论文笔记】TransUNet: Transformers Make StrongEncoders for Medical Image Segmentation
Simple understanding of MySQL database