C#使用Fixed创建固定大小的缓冲区

在 C# 中,可以使用 fixed 语句在数据结构中创建带有固定大小数组的缓冲区。 使用现有代码(如使用其他语言、预先存在的 DLL 或 COM 项目编写的代码)时,这种方法非常有用。

固定数组可采用允许普通结构成员使用的任何特性或修饰符。 唯一的限制是,数组类型必须是 bool、byte、 char、 short、int、long、sbyte、ushort、uint、ulong、float 或 double。

private fixed char name[30];

在早期版本的 C# 中,声明 C++ 样式的固定大小结构是很困难的,因为包含数组的 C# 结构不包含数组元素。 相反,该结构包含对元素的引用。

C# 2.0 添加了在 struct(当用在 unsafe 代码块中时)中嵌入固定大小的数组的功能。

例如,在 C# 2.0 之前,下面的 struct 的大小为 8 字节。 pathName 数组是对堆分配数组的引用:

public struct MyArray
    {
        public char[] pathName;
        private int reserved;
    }

从 C# 2.0 开始,struct 可以包含嵌入的数组。 在下面的示例中,fixedBuffer 数组有固定的大小。

若要访问数组的元素,应使用 fixed 语句建立指向第一个元素的指针。 fixed 语句将 fixedBuffer 实例固定到内存中的特定位置。

namespace FixedSizeBuffers
{
    internal unsafe struct MyBuffer
    {
        public fixed char fixedBuffer[128];
    }

    internal unsafe class MyClass
    {
        public MyBuffer myBuffer = default(MyBuffer);
    }

    internal class Program
    {
        static void Main()
        {
            MyClass myC = new MyClass();

            unsafe
            {
                // Pin the buffer to a fixed location in memory.
                fixed (char* charPtr = myC.myBuffer.fixedBuffer)
                {
                    *charPtr = ‘A‘;
                }
            }
        }
    }
}

128 个元素的 char 数组的大小为 256 字节。 在固定大小的 char 缓冲区中,每个字符始终占用两个字节,而与编码无关。

即使将 char 缓冲区封送到具有 CharSet = CharSet.Auto 或 CharSet = CharSet.Ansi 的 API 方法或结构,也是如此。 有关更多信息,请参见 CharSet

另一种常见的固定大小的数组是 bool 数组。 bool 数组中元素的大小始终为一个字节。 bool 数组不适合于创建位数组或缓冲区。

除了用 stackalloc 创建的内存之外,C# 编译器和公共语言运行时 (CLR) 不执行任何安全缓冲区溢出检查。 与所有不安全代码一样,请谨慎使用。

不安全缓冲区与常规数组在以下方面不同:

  • 不安全缓冲区只能用在不安全上下文中。
  • 不安全缓冲区始终是向量(或一维数组)。
  • 数组的声明应包括其本身长度,如 char id[8]。 而不能使用 char id[]。
  • 不安全缓冲区只能是不安全上下文中的结构的实例字段。
时间: 2024-10-02 03:36:42

C#使用Fixed创建固定大小的缓冲区的相关文章

[笔记][Java7并发编程实战手册]4.3 创建固定的线程执行器newFixedThreadPool线程池

[笔记][Java7并发编程实战手册]系列目录 简介 newFixedThreadPool(int nThreads, ThreadFactory threadFactory) 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的 ThreadFactory 创建新线程. newCachedThreadPool()创建的线程池的特性是:自动回收不使用的线程(终止并从缓存中移除那些已有 60 秒钟未被使用的线程),(在无可用线程的情况下)自动的为新来的task创

【MongoDB】Capped固定大小/数量集合

不同于普通集合,固定集合必须在使用之前显示创建,可以使用create命令创建固定集合.在shell中,可以使用db.createCollection函数: //创建大小为1024字节的固定集合 db.createCollection("capped",{capped:true,size:1024}); //创建大小为1024字节,文档数量为100的固定集合 db.createCollection("capped",{capped:true,size:1024,max

问题:如何在固定大小的DIV层插入N多个图片

这是贴友问的一个问题,具体需求是: 如何在固定大小的DIV层插入N多个图片,使其一行排列,超出层宽时出现滑动条? 原以为利用overflow属性可以实现,但是测试失败.后来利用div层叠实现了效果. HTML代码: 1: <!-- 如何在固定大小的DIV层插入N多个图片,使其一行排列,超出层宽时出现滑动条? --> 2: <!DOCTYPE html> 3: <html> 4: <head> 5: <meta http-equiv="cont

Android裁剪固定大小头像的功能

转载自: http://www.eoeandroid.com/thread-497277-1-1.html 效果很好,特意转载过来记录一下,加深一下印象. 效果就是 :中间的方框不动,可以拖动图片,选择要裁剪的位置. 源码下载地址:http://download.csdn.net/detail/abc13939746593/7540163 Android裁剪固定大小头像的功能,布布扣,bubuko.com

【转】javascript弹出固定大小的窗口页面

来源:http://weicfprince.blog.163.com/blog/static/8441066920081010113231969/ 现在我们想弹出一个WEB窗体,让其处于屏幕的中间位置,并设置其固定大小,固定外观显示.我们可以在一个JS文件中写这样一个函数: //弹出固定大小固定位置固定外观的新窗口 function OpenWindow(url,w,h) { var left=Math.round((window.screen.availWidth-w)/2); var top

6、java5线程池之固定大小线程池newFixedThreadPool

1 package com.yzl; 2 3 import java.util.Random; 4 import java.util.concurrent.Callable; 5 import java.util.concurrent.ExecutorService; 6 import java.util.concurrent.Executors; 7 import java.util.concurrent.Future; 8 import java.util.concurrent.TimeUn

java实现把一个大文件切割成N个固定大小的文件

//java实现把一个大文件切割成N个固定大小的文件 package com.johnny.test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; public class FenGeFile { p

点击弹出固定大小的新窗口(js实现)

<SCRIPT LANGUAGE="javascript"> <!-- window.open ('page.html') --> </SCRIPT> 固定大小: <SCRIPT LANGUAGE="javascript"> <!-- //这句要写成一行 window.open ('page.html', 'newwindow', 'height=100, width=400, top=0, left=0, to

QT以QImag显示图片并且以固定大小放缩后显示

QImage image; image.load(fileName);//fileName为图片的路径 QImage result = image.scaled(800, 600).scaled(120, 180, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);//放缩图片,以固定大小显示 ImageLabel->setPixmap(QPixmap::fromImage(result));//在Label控件上显示图片