当前位置:网站首页>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;// length
IntPtr 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 uncertain
p = 2;
Marshal.StructureToPtr(p,t,false);
p = Marshal.PtrToStructure<int>(t);
Console.WriteLine("p " + p);//2
// Traverse
Console.WriteLine(" Traverse ");
for (int i = 0; i < 10; i++)
{
t = buffer + i * sizeof(int);
Console.WriteLine(Marshal.PtrToStructure<int>(t));
}
Traverse :
43909312
44502144
2
0
0
24
1357220181
196712
550912
543686656
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;// length
IntPtr 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 module
Trying 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;// length
IntPtr 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 .
边栏推荐
- Xingnuochi technology's IPO was terminated: it was planned to raise 350million yuan, with an annual revenue of 367million yuan
- pychrm社区版调用matplotlib.pyplot.imshow()函数图像不弹出的解决方法
- Benefit a lot, Android interview questions
- [depth first search] Ji suanke: a joke of replacement
- Don't miss this underestimated movie because of controversy!
- 包装行业商业供应链管理平台解决方案:布局智慧供应体系,数字化整合包装行业供应链
- Dark horse -- redis
- About NPM install error 1
- 应用使用Druid连接池经常性断链问题分析
- Sanmian ant financial successfully got the offer, and has experience in Android development agency recruitment and interview
猜你喜欢
黑马--Redis篇
LeetCode-1279. 红绿灯路口
MRO industrial products enterprise procurement system: how to refine procurement collaborative management? Industrial products enterprises that want to upgrade must see!
LeetCode-1279. Traffic light intersection
业务与应用同步发展:应用现代化的策略建议
朗坤智慧冲刺科创板:年营收4亿 拟募资7亿
Take a look at how cabloyjs workflow engine implements activiti boundary events
[depth first search] Ji suanke: Square
About static type, dynamic type, ID, instancetype
多线程基础:线程基本概念与线程的创建
随机推荐
Intelligent supply chain management system solution for hardware and electromechanical industry: digital intelligent supply chain "creates new blood" for traditional industries
PMP practice once a day | don't get lost in the exam -7.6
Oracle advanced (IV) table connection explanation
Test technology stack arrangement -- self cultivation of test development engineers
R language uses DT function to generate t-distribution density function data and plot function to visualize t-distribution density function data
Implementation of AVL tree
tensorflow和torch代码验证cuda是否安装成功
Word如何显示修改痕迹
If you have any problems, you can contact me. A rookie ~
About NPM install error 1
Understanding disentangling in β- VAE paper reading notes
Based on butterfly species recognition
Tongyu Xincai rushes to Shenzhen Stock Exchange: the annual revenue is 947million Zhang Chi and Su Shiguo are the actual controllers
helm部署etcd集群
Fast power template for inverse element, the role of inverse element and example [the 20th summer competition of Shanghai University Programming League] permutation counting
openmv4 学习笔记1----一键下载、图像处理背景知识、LAB亮度-对比度
test about BinaryTree
R语言ggplot2可视化:使用ggpubr包的ggdotplot函数可视化点阵图(dot plot)、设置palette参数设置不同水平点阵图数据点和箱图的颜色
中缀表达式转后缀表达式详细思路及代码实现
Openmv4 learning notes 1 --- one click download, background knowledge of image processing, lab brightness contrast