C# 在c语言中将一个ulong解析为两个uint变量#
我有一系列的C# 在c语言中将一个ulong解析为两个uint变量#,c#,performance,parsing,C#,Performance,Parsing,我有一系列的ulong实例,每个实例都包含两个独立的值。前4个字节表示一个uint值,后4个字节表示另一个值。将ulong解析为两个uint变量的最有效方法是什么?这将在紧密循环中发生,因此我正在寻找最快的模式。两个选项: 使用不安全的code或滥用显式布局struct(作为一个联合体)将其无声地撕成碎片 使用轮班操作 我通常更喜欢后者;i、 e uint x = (uint)(value & 0xFFFFFFFF), y = (uint)((value >> 32)&a
ulong
实例,每个实例都包含两个独立的值。前4个字节表示一个uint
值,后4个字节表示另一个值。将ulong
解析为两个uint
变量的最有效方法是什么?这将在紧密循环中发生,因此我正在寻找最快的模式。两个选项:
- 使用不安全的
code或滥用显式布局
(作为一个联合体)将其无声地撕成碎片struct
- 使用轮班操作
uint x = (uint)(value & 0xFFFFFFFF), y = (uint)((value >> 32)&0xFFFFFFFF)
除了在更多环境中工作(并非所有虚拟机都允许不安全
),这还避免了在不同的endian机器上(可能使用Mono)出现混淆的风险
不安全的版本类似于:
uint* ptr = (uint*)(void*)&value;
uint x = ptr[0], y = ptr[1];
哪一个更快:try是选项和时间t!微观优化只能在特定的代码上下文中进行评估。您也可以使用重叠字段(类似于C联合)显式布局结构
虽然就我个人而言,我仍然会使用位移位。显式布局的结构隐藏了正在发生的事情,而且非常模糊。我提到了这个结构,但它绝对值得作为一个完整的示例—很好的补充谢谢。。。我测试了三种变体。(1) 管理移位[如上],(2)不安全移位[也如上],(3)位转换器变化。我的测试表明,有管理的换档变化最快(然后是2档,然后是3档)。谢谢,我选择选项1。@MarcGravel出于好奇,你能给我看看反面吗。。。e、 g.取两个uint
变量并将它们合并成一个ulong
?@Joevalue=((ulong)x)|((ulong)y)@Joe只是术语:#2不是一个“移位”(
是“移位”运算符)。它只是对原始内存的不安全访问。@MarcGravel谢谢……这将非常有用
[StructLayout(LayoutKind.Explicit)]
struct SplitStruct
{
[FieldOffset(0)]
public ulong ulongValue;
[FieldOffset(0)]
public uint uintValue1;
[FieldOffset(4)]
public unit uintValue2;
}