小编Ken*_*ent的帖子

我们是否在Go中过度使用指针传递?

这个问题特定于函数调用,并且当通过值与指针传递结构时,指向Go优化器的可信度.

如果您想知道何时在struct字段中使用值与指针,请参阅:Go - Performance - struct中指针和值之间的区别是什么?

请注意: 我试图说出这一点,以便任何人都能理解,因此某些术语是不精确的.

一些低效的Go Code

我们假设我们有一个结构:

type Vec3 struct{
  X, Y, X float32
}
Run Code Online (Sandbox Code Playgroud)

我们想要创建一个计算两个向量的叉积的函数.(对于这个问题,数学并不重要.)有几种方法可以解决这个问题.一个天真的实现将是:

func CrossOf(a, b Vec3) Vec3{
  return Vec3{
    a.Y*b.Z - a.Z*b.Y,
    a.Z*b.X - a.X*b.Z,
    a.X*b.Y - a.Y*b.X,
  }
}
Run Code Online (Sandbox Code Playgroud)

通过以下方式调用:

a:=Vec3{1,2,3}
b:=Vec3{2,3,4}
var c Vec3

// ...and later on:
c := CrossOf(a, b)
Run Code Online (Sandbox Code Playgroud)

这很好用,但在Go中,它显然效率不高. ab通过值(复制)传递到函数中,并再次复制结果.虽然这是一个小例子,但如果我们考虑大结构,问题就更明显了.

更有效的实施方案是:

func (res *Vec3) CrossOf(a, b *Vec3) {
  // Cannot assign directly since we are using pointers.  It's possible that a or …
Run Code Online (Sandbox Code Playgroud)

optimization pointers conventions calling-convention go

9
推荐指数
1
解决办法
806
查看次数

两个四元数旋转的点积

我知道两个四元数的点(或内部)乘积是旋转之间的角度(包括轴旋转).这使得点积等于四元数超球面上两点之间的角度.
但是,我无法找到如何实际计算点积.

任何帮助,将不胜感激!

当前代码:

public static float dot(Quaternion left, Quaternion right){
    float angle;

    //compute

    return angle;
}
Run Code Online (Sandbox Code Playgroud)

定义为Quaternion.w,Quaternion.x,Quaternion.y和Quaternion.z.

注意:可以假设四元数是标准化的.

java math rotation quaternions dot-product

6
推荐指数
3
解决办法
1万
查看次数

Java中的Xor Bytes

Java不支持字节上的逐位操作.我想像这样xor两个字节:

xoredByte = byte1 ^ byte2;
Run Code Online (Sandbox Code Playgroud)

在java中,这必须完成:

xoredByte = (byte) (byte1 ^ byte2);
Run Code Online (Sandbox Code Playgroud)

编译为:

xoredByte = (byte) ((int)byte1 ^ (int)byte2);
Run Code Online (Sandbox Code Playgroud)

这在所有情况下都有效吗?我的意思是,这些等同的陈述是什么?

如果没有,代码将执行此操作是什么?

java casting xor

5
推荐指数
2
解决办法
1万
查看次数