最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#使用stackalloc分配堆棧內(nèi)存和非托管類型詳解

 更新時(shí)間:2022年12月12日 09:35:41   作者:codemissing  
這篇文章主要為大家介紹了C#使用stackalloc分配堆棧內(nèi)存和非托管類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>

stackalloc 表達(dá)式

stackalloc表達(dá)式在棧(stack)上分配內(nèi)存塊。

在方法執(zhí)行期間創(chuàng)建的棧中分配的內(nèi)存塊會(huì)在方法返回時(shí)自動(dòng)丟棄。不能顯式釋放使用 stackalloc 分配的內(nèi)存。stackalloc分配的內(nèi)存塊不受垃圾回收的影響,也不必通過 fixed 語句固定。

棧內(nèi)存,棧內(nèi)存開辟快速高效但資源有限,通常限制1M。

可以將 stackalloc 表達(dá)式的結(jié)果分配給以下任一類型的變量:

stackalloc 分配 System.Span<T> 或 System.ReadOnlySpan<T> 類型

int length = 3;
Span<int> numbers = stackalloc int[length];
for (var i = 0; i < length; i++)
{
    numbers[i] = i;
}

stack分配內(nèi)存塊賦值給 System.Span<T>System.ReadOnlySpan<T> 類型的變量不必使用不安全上下文(unsafe context)。

可以在表達(dá)式允許的任何地方使用stackalloc,并且在需要分配內(nèi)存時(shí),推薦盡可能的使用 Span<T>ReadOnlySpan<T> 類型。

int length = 1000;
Span<byte> buffer = length <= 1024 ? stackalloc byte[length] : new byte[length];
Span<int> numbers = stackalloc[] { 1, 2, 3, 4, 5, 6 };
var ind = numbers.IndexOfAny(stackalloc[] { 2, 4, 6, 8 });
Console.WriteLine(ind);  // output: 1

stackalloc 分配 指針類型

如下示例,對(duì)于指針類型,stackalloc表達(dá)式只能用于本地變量聲明的初始化中。

unsafe
{
    int length = 3;
    int* numbers = stackalloc int[length];
    for (var i = 0; i < length; i++)
    {
        numbers[i] = i;
    }
}

使用指針類型,必須使用不安全上下文(unsafe context)。

stackalloc分配內(nèi)存的注意點(diǎn)

堆??捎玫膬?nèi)存數(shù)量是有限的,如果分配太多內(nèi)存,則可能發(fā)生StackOverflowException異常。因此需要注意以下幾點(diǎn):

  • 限制使用stackalloc分配的內(nèi)存數(shù)量。

例如,如果預(yù)期的緩沖區(qū)大小低于某個(gè)限制,則可以在堆棧上分配內(nèi)存;否則,請(qǐng)使用所需長度的數(shù)組。如下代碼所示:

const int MaxStackLimit = 1024;
Span<byte> buffer = inputLength <= MaxStackLimit ? stackalloc byte[MaxStackLimit] : new byte[inputLength];

stack 上可用內(nèi)存數(shù)量取決于代碼的執(zhí)行環(huán)境。

  • 避免在循環(huán)內(nèi)部使用stackalloc。在循環(huán)外部allocate分配內(nèi)存塊,并在循環(huán)內(nèi)部重用。

新分配內(nèi)存的內(nèi)容是未定義的。必須在使用之前初始化。 比如,可以使用 Span<T>.Clear 方法設(shè)置所有的元素項(xiàng)為類型T的默認(rèn)值。

也可以使用數(shù)組初始化器定義新分配內(nèi)存的內(nèi)容。

Span<int> first = stackalloc int[3] { 1, 2, 3 };
Span<int> second = stackalloc int[] { 1, 2, 3 };
ReadOnlySpan<int> third = stackalloc[] { 1, 2, 3 };

非托管類型 Unmanaged type

在定義指針、stackalloc T[n]時(shí),其類型只能是非托管類型。(雖然在使用和形式上,非托管類型與C#的原始類型幾乎沒有區(qū)別,但,還是可以了解下)。

以下類型的屬于或也屬于非托管類型:

  • sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, or bool
  • 任何 enum 類型
  • 任何 pointer 類型
  • 任何 只包含非托管類型字段的用戶定義(user-defined)的 struct 類型

使用非托管泛型約束unmanaged,指定類型參數(shù)為非指針、不可為空的非托管類型。

僅包含非托管類型字段的構(gòu)造結(jié)構(gòu)類型(constructed struct type)也是非托管的。如下示例所示,DisplaySize<T>()方法的泛型約束為unmanaged,在調(diào)用時(shí)Coords<int>、Coords<double>作為非托管類型使用:

using System;
public struct Coords<T>
{
    public T X;
    public T Y;
}
public class UnmanagedTypes
{
    public static void Main()
    {
        DisplaySize<Coords<int>>();
        DisplaySize<Coords<double>>();
    }
    private unsafe static void DisplaySize<T>() where T : unmanaged
    {
        Console.WriteLine($"{typeof(T)} is unmanaged and its size is {sizeof(T)} bytes");
    }
}
// Output:
// Coords`1[System.Int32] is unmanaged and its size is 8 bytes
// Coords`1[System.Double] is unmanaged and its size is 16 bytes

泛型結(jié)構(gòu)Coords<T>可以是非托管和托管構(gòu)造類型。當(dāng)然也可以限制為非托管類型,如下:

public struct Coords<T> where T : unmanaged
{
    public T X;
    public T Y;
}

參考

stackalloc expression

Unmanaged types

以上就是C#使用stackalloc分配堆棧內(nèi)存和非托管類型詳解的詳細(xì)內(nèi)容,更多關(guān)于C# stackalloc分配堆棧內(nèi)存的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# byte轉(zhuǎn)為有符號(hào)整數(shù)實(shí)例

    C# byte轉(zhuǎn)為有符號(hào)整數(shù)實(shí)例

    這篇文章主要介紹了C# byte轉(zhuǎn)為有符號(hào)整數(shù)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 純C#實(shí)現(xiàn)Hook功能詳解

    純C#實(shí)現(xiàn)Hook功能詳解

    這篇文章主要介紹了純C#實(shí)現(xiàn)Hook功能詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • C#寫差異文件備份工具的示例

    C#寫差異文件備份工具的示例

    這篇文章主要介紹了C#寫差異文件備份工具的示例,幫助大家利用c#備份,管理文件,感興趣的朋友可以了解下
    2020-10-10
  • C#使用Dll的幾種方法示例

    C#使用Dll的幾種方法示例

    使用 DLL(動(dòng)態(tài)鏈接庫)是 C# 開發(fā)中常見的任務(wù)之一,DLL 文件包含可以在運(yùn)行時(shí)加載的代碼和數(shù)據(jù),允許程序共享功能和資源,降低程序的內(nèi)存占用并促進(jìn)代碼的復(fù)用,本篇文章將深入探討 C# 中使用 DLL 的多種方法,并提供相關(guān)代碼示例,需要的朋友可以參考下
    2024-10-10
  • C#獲取Excel文件所有文本數(shù)據(jù)內(nèi)容的示例代碼

    C#獲取Excel文件所有文本數(shù)據(jù)內(nèi)容的示例代碼

    獲取上傳的?EXCEL?文件的所有文本信息并存儲(chǔ)到數(shù)據(jù)庫里,可以進(jìn)一步實(shí)現(xiàn)對(duì)文件內(nèi)容資料關(guān)鍵字查詢的全文檢索,有助于我們定位相關(guān)文檔,本文詳細(xì)介紹了C#獲取Excel文件所有文本數(shù)據(jù)內(nèi)容實(shí)現(xiàn)步驟和代碼,需要的朋友可以參考下
    2024-07-07
  • .net使用Aspose.Words進(jìn)行Word替換操作的實(shí)現(xiàn)代碼

    .net使用Aspose.Words進(jìn)行Word替換操作的實(shí)現(xiàn)代碼

    之前在工作中,需要實(shí)現(xiàn)Word打印功能,并且插入圖片。當(dāng)時(shí)采取的方式則是使用書簽進(jìn)行操作。首先在word內(nèi)插入書簽,完成后,存為模板。程序加載該模板,找到書簽,并在指定位置寫入文字即可
    2013-05-05
  • C# double類型變量比較分析

    C# double類型變量比較分析

    這篇文章主要介紹了C# double類型變量比較分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C#基礎(chǔ):Equals()與運(yùn)算符==的區(qū)別分析

    C#基礎(chǔ):Equals()與運(yùn)算符==的區(qū)別分析

    本篇文章是對(duì)c#中的Equals()與運(yùn)算符==的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C#文件和字節(jié)流的轉(zhuǎn)換方法

    C#文件和字節(jié)流的轉(zhuǎn)換方法

    這篇文章主要介紹了C#文件和字節(jié)流的轉(zhuǎn)換方法,涉及C#將文件以字節(jié)流形式讀取及將字節(jié)流寫入文件的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C#直線的最小二乘法線性回歸運(yùn)算實(shí)例

    C#直線的最小二乘法線性回歸運(yùn)算實(shí)例

    這篇文章主要介紹了C#直線的最小二乘法線性回歸運(yùn)算方法,實(shí)例分析了給定一組點(diǎn),用最小二乘法進(jìn)行線性回歸運(yùn)算的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08

最新評(píng)論

平昌县| 密山市| 古丈县| 上林县| 南宁市| 拉萨市| 保亭| 兖州市| 仁寿县| 莱西市| 盐池县| 客服| 昭苏县| 水城县| 林甸县| 陕西省| 南阳市| 酒泉市| 连江县| 雷山县| 陈巴尔虎旗| 塔城市| 简阳市| 玉林市| 望城县| 长岭县| 宝清县| 永吉县| 武汉市| 武穴市| 灵宝市| 丹阳市| 昭通市| 商南县| 富蕴县| 宁夏| 神农架林区| 贡觉县| 夏河县| 胶南市| 海丰县|