Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c语言中将一个ulong解析为两个uint变量#_C#_Performance_Parsing - Fatal编程技术网

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
    (作为一个联合体)将其无声地撕成碎片
  • 使用轮班操作
我通常更喜欢后者;i、 e

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
?@Joe
value=((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;
}