当前位置:网站首页>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 .
边栏推荐
- 如何提高网站权重
- R语言ggplot2可视化:使用ggpubr包的ggdotplot函数可视化点阵图(dot plot)、设置palette参数设置不同水平点阵图数据点和箱图的颜色
- How are you in the first half of the year occupied by the epidemic| Mid 2022 summary
- Cereals Mall - Distributed Advanced p129~p339 (end)
- helm部署etcd集群
- Xingnuochi technology's IPO was terminated: it was planned to raise 350million yuan, with an annual revenue of 367million yuan
- GCC [7] - compilation checks the declaration of functions, and link checks the definition bugs of functions
- Three years of Android development, Android interview experience and real questions sorting of eight major manufacturers during the 2022 epidemic
- Multithreading Basics: basic concepts of threads and creation of threads
- 包装行业商业供应链管理平台解决方案:布局智慧供应体系,数字化整合包装行业供应链
猜你喜欢

php+redis实现超时取消订单功能

基于蝴蝶种类识别

How to type multiple spaces when editing CSDN articles

ROS自定义消息发布订阅示例

Master Xuan joined hands with sunflower to remotely control enabling cloud rendering and GPU computing services

Reptiles have a good time. Are you full? These three bottom lines must not be touched!

How word displays modification traces

助力安全人才专业素养提升 | 个人能力认证考核第一阶段圆满结束!

MRO工业品企业采购系统:如何精细化采购协同管理?想要升级的工业品企业必看!
![Looting iii[post sequence traversal and backtracking + dynamic planning]](/img/9b/e9eeed138e46afdeed340bf2629ee1.png)
Looting iii[post sequence traversal and backtracking + dynamic planning]
随机推荐
short i =1; i=i+1与short i=1; i+=1的区别
Cereals Mall - Distributed Advanced p129~p339 (end)
ACTF 2022圆满落幕,0ops战队二连冠!!
Unlock 2 live broadcast themes in advance! Today, I will teach you how to complete software package integration Issues 29-30
Deep circulation network long-term blood pressure prediction [translation]
A wearable arm device for night and sleeveless blood pressure measurement [translation]
三面蚂蚁金服成功拿到offer,Android开发社招面试经验
Fast power template for inverse element, the role of inverse element and example [the 20th summer competition of Shanghai University Programming League] permutation counting
Detailed idea and code implementation of infix expression to suffix expression
Noninvasive and cuff free blood pressure measurement for telemedicine [translation]
Implementation of AVL tree
[paper notes] transunet: transformers make strongencoders for medical image segmentation
青龙面板最近的库
MRO industrial products enterprise procurement system: how to refine procurement collaborative management? Industrial products enterprises that want to upgrade must see!
AIRIOT物联网平台赋能集装箱行业构建【焊接工位信息监控系统】
倒计时2天|腾讯云消息队列数据接入平台(Data Import Platform)直播预告
保证接口数据安全的10种方案
RedisSystemException:WRONGTYPE Operation against a key holding the wrong kind of value
[depth first search] Ji suanke: find numbers
Mathematical knowledge -- code implementation of Gaussian elimination (elementary line transformation to solve equations)