【发布时间】:2017-07-12 11:36:05
【问题描述】:
我想生成一个 C# sqrt 基准,但某些 sqrt 函数需要一个联合来进行按位计算。
我的工会是这样定义的:
[StructLayout(LayoutKind.Explicit)]
struct U
{
[FieldOffset(0)]
public int i;
[FieldOffset(0)]
public float x;
}
下一个代码在u.i 上产生未分配字段错误:
U u;
u.x = x;
u.i = (1 << 29) + (u.i >> 1) - (1 << 22);
我知道 u.i 是在 u.x 也被分配的时候被分配的,所以如果没有明确的 u.i 分配,是否可以在编译时忽略未分配的字段错误?
【问题讨论】:
-
不,你不能忽视。只需添加它。但是...为什么要在 C# 中模拟联合?!?!使用双打可以使用
BitConverter。使用浮点数...作为基准,我会省略分配并只计算sqrt(),不会测量u.i的额外分配。如果你真的想那样做,那就慢慢来:stackoverflow.com/q/21801213/1207195 -
@AdrianoRepetti 主要 C 函数作为一个联合我只想尽可能地复制为 C(ish)。 BitConverter 似乎比基本的“模拟”慢?工会,但如果它是错误的,我会使用它。顺便说一句,我同意额外的任务。
-
检查链接的帖子,在接受的答案中有
unsafe内存访问,应该和C一样快union
标签: c# struct structlayout