c# - 如何在不分配内存的情况下向单个 Span<byte> 添加零填充?

标签 c# performance memory-management

我有一个方法可以转换 Span<byte>int :

int ConvertToInt32(Span<byte> buffer)
{
    if (buffer.Length != 4)
    {
        // add zero-padding to the buffer
    }

    return BitConverter.ToInt32(buffer);
    // or MemoryMarshal....
}

如果输入参数 ( buffer) 长度为 4,则转换有效,但如果它少于 4 个字节,则无效。 我正在寻找一种非分配方法来执行此操作。 那么如何向 buffer 添加零填充呢?转换之前,还是有其他解决方案?

最佳答案

您可以使用 stackalloc 在堆栈上进行分配这应该比在堆上分配更便宜,并且是高性能场景 AFAIK 中的常用方法:

Span<byte> buffer = stackalloc byte[3] {0,0,1};
if (buffer.Length != 4)
{
    Span<byte> interimBuffer = stackalloc byte[4];
    // ..
}

请注意,您可以转换为具有相应大小的类型,然后转换为 int:

if (buffer.Length == 2)
{
    var int16 = (int)BitConverter.ToInt16(buffer);
}

但由于分支,它的性能可能会更差。

也不要忘记计算机体系结构的字节序 as written in the docs .

关于c# - 如何在不分配内存的情况下向单个 Span<byte> 添加零填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75189838/

相关文章:

c# - 不明白为什么我们会收到错误 CS0234

mysql - MySQL 中的高效子查询

python - 使用索引循环的最快方法

c# - 绑定(bind)自定义 DataGridHeader MVVM

c# - 如何模拟 OracleConnection 和 OracleCommand?

java - java 是否在 for 循环中缓存数组引用?

c++ - 在 C++ 程序中使用电子围栏

cocoa-touch - iPad应用程序崩溃导致重启内存问题?

java - JVM作为一个进程的内存细节

c# - 需要帮助调试 : Having trouble getting data to Silverlight App through RIA Services, Entity Framework ,MySQL