当前位置:网站首页>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语言dplyr包进行数据分组聚合统计变换(Aggregating transforms)、计算dataframe数据的分组均值(mean)
- In 50W, what have I done right?
- Meilu biological IPO was terminated: the annual revenue was 385million, and Chen Lin was the actual controller
- 打家劫舍III[后序遍历与回溯+动态规划]
- How to type multiple spaces when editing CSDN articles
- 应用使用Druid连接池经常性断链问题分析
- CCNP Part 11 BGP (III) (essence)
- Handwritten online chat system (principle part 1)
- If you have any problems, you can contact me. A rookie ~
- pytorch常见损失函数
猜你喜欢

Computer network: sorting out common network interview questions (I)
![Deep circulation network long-term blood pressure prediction [translation]](/img/9c/c1ed28242a4536c1e8fde3414f82a8.png)
Deep circulation network long-term blood pressure prediction [translation]

Lucun smart sprint technology innovation board: annual revenue of 400million, proposed to raise 700million

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

The list of people who passed the fifth phase of personal ability certification assessment was published
Three years of Android development, Android interview experience and real questions sorting of eight major manufacturers during the 2022 epidemic

中缀表达式转后缀表达式详细思路及代码实现
三年Android开发,2022疫情期间八家大厂的Android面试经历和真题整理

Sanmian ant financial successfully got the offer, and has experience in Android development agency recruitment and interview

pychrm社区版调用matplotlib.pyplot.imshow()函数图像不弹出的解决方法
随机推荐
业务与应用同步发展:应用现代化的策略建议
pytorch常见损失函数
MATLAB中deg2rad和rad2deg函数的使用
C#/VB. Net to add text / image watermarks to PDF documents
快速幂模板求逆元,逆元的作用以及例题【第20届上海大学程序设计联赛夏季赛】排列计数
QLabel 跑马灯文字显示
Implementation of AVL tree
How to improve website weight
CCNP Part 11 BGP (III) (essence)
Helm deploy etcd cluster
Php+redis realizes the function of canceling orders over time
驼峰式与下划线命名规则(Camel case With hungarian notation)
Analysis of frequent chain breaks in applications using Druid connection pools
test about BinaryTree
Installation and management procedures
三面蚂蚁金服成功拿到offer,Android开发社招面试经验
MRO工业品企业采购系统:如何精细化采购协同管理?想要升级的工业品企业必看!
Tensorflow and torch code verify whether CUDA is successfully installed
When visual studio code starts, it prompts "the code installation seems to be corrupt. Please reinstall." Solution to displaying "unsupported" information in the title bar
Reptiles have a good time. Are you full? These three bottom lines must not be touched!