背景:我决定将我在Python中演变的3D图形脚本重新编写为C以提高速度.这涉及到我学习C.有问题的程序的一部分缓存关于3D网格的法线信息.
有3个按顺序调用此向量运算(相当标准:矢量减法得到边缘向量,叉积和平均),我想应该尽可能地快,所以我试图避免在堆上不必要存储任何东西...并且复制我的结构太多次了.但是,我也知道如果我返回指针,我会指向mem空间,这个空间不再有效.
这是我如何尝试编写所有三个函数(一般来说:struct copy in,struct copy out,而不是指针).
typedef struct vector vector;
struct vector{
double x,y,z;
};
vector vect(vector a, vector b){
vector res;
res.x = b.x - a.x;
res.y = b.y - a.y;
res.z = b.z - a.z;
return res;
}
vector cross(vector a, vector b){
vector res;
res.x = a.y*b.z - a.z*b.y;
res.y = a.z*b.x - a.x*b.z;
res.z = a.x*b.y - a.y*b.x;
return res;
}
vector avg (vector a, vector b){
vector res;
res.x = (a.x + b.x)/2;
res.y …Run Code Online (Sandbox Code Playgroud) 这是我使用C ++并进行学习的第一年。我目前正在阅读“返回值优化”(我使用C ++ 11 btw)。例如在这里https://en.wikipedia.org/wiki/Return_value_optimization,立即想到这些具有原始类型的初学者示例:
int& func1()
{
int i = 1;
return i;
}
//error, 'i' was declared with automatic storage (in practice on the stack(?))
//and is undefined by the time function returns
Run Code Online (Sandbox Code Playgroud)
...还有这个:
int func1()
{
int i = 1;
return i;
}
//perfectly fine, 'i' is copied... (to previous stack frame... right?)
Run Code Online (Sandbox Code Playgroud)
现在,我开始尝试根据另外两个方面来理解它:
Simpleclass func1()
{
return Simpleclass();
}
Run Code Online (Sandbox Code Playgroud)
这里实际发生了什么?编辑:我知道大多数编译器将优化此,我问的不是'if',而是:
非常感谢,
请帮助我解决为什么这不起作用.(这不是一个实际问题,它是OCPJP考试的精神练习.)
public class ImplicitConversions {
Integer iBoxed;
short sPrimitive = (short)iBoxed;
}
Run Code Online (Sandbox Code Playgroud)
//编译错误:不兼容的类型; 要求:简短,发现:整数
我假设编译器尝试在没有(或之前)拆箱的情况下首先进行投射,而例如算术运算(iBoxed + iBoxed)将首先取消装箱.因此,可以肯定地说,自动装箱/拆箱在操作顺序(一元,算术,关系,逻辑,条件,分配)中有它的位置,它究竟在哪里?
我一直在阅读下面的源代码中的转换(为了确保我与1.6兼容),但是这个让我望而却步.谢谢. http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html#20232