这个问题特定于函数调用,并且当通过值与指针传递结构时,指向Go优化器的可信度.
如果您想知道何时在struct字段中使用值与指针,请参阅:Go - Performance - struct中指针和值之间的区别是什么?
请注意: 我试图说出这一点,以便任何人都能理解,因此某些术语是不精确的.
我们假设我们有一个结构:
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中,它显然效率不高. a并b通过值(复制)传递到函数中,并再次复制结果.虽然这是一个小例子,但如果我们考虑大结构,问题就更明显了.
更有效的实施方案是:
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) 我知道两个四元数的点(或内部)乘积是旋转之间的角度(包括轴旋转).这使得点积等于四元数超球面上两点之间的角度.
但是,我无法找到如何实际计算点积.
任何帮助,将不胜感激!
当前代码:
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不支持字节上的逐位操作.我想像这样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 ×2
casting ×1
conventions ×1
dot-product ×1
go ×1
math ×1
optimization ×1
pointers ×1
quaternions ×1
rotation ×1
xor ×1