C 矩阵库:内联vs定义
我正在创建一个矩阵库,其中包含一系列函数,比如这个函数(实际上是一个很长的函数): 或 或者创建一个函数(但它创建一个函数调用却不需要任何东西)C 矩阵库:内联vs定义,c,optimization,C,Optimization,我正在创建一个矩阵库,其中包含一系列函数,比如这个函数(实际上是一个很长的函数): 或 或者创建一个函数(但它创建一个函数调用却不需要任何东西) 一种方法更简洁,并且总是被扩展(它将验证mat1和mat2是否仍然是浮点数组) 第二种方法更安全,它验证数组的长度,但不太简洁,可能无法扩展 你会做什么,你希望矩阵库做什么 我希望我的库相当快(对于OpenGL应用程序),相当小并且易于使用。使用内联关键字。如果使用预处理器开发类似宏的函数,则有几个缺点: 无类型安全检查 无健全性检查 调试不好
- 一种方法更简洁,并且总是被扩展(它将验证mat1和mat2是否仍然是浮点数组)
- 第二种方法更安全,它验证数组的长度,但不太简洁,可能无法扩展
我希望我的库相当快(对于OpenGL应用程序),相当小并且易于使用。使用
内联
关键字。如果使用预处理器开发类似宏的函数,则有几个缺点:
- 无类型安全检查
- 无健全性检查
- 调试不好
- 可读性差
- 传递给宏的表达式的计算次数可以超过
void matx_multiply(int x, float mat1[], float mat2[], float result[])
{
int row,col,k;
for (row=0; row<x; row++) {
for(col=0; col<x; col++){
result[row + col*x]=0.0f;
for (k=0; k<x; k++)
{
result[row + col*x]+=mat1[row + k*x]*mat2[k + col*x];
}
}
}
}
#define mat2_multiply(m1,m2,res) matx_multiply(2,m1,m2,res)
#define mat3_multiply(m1,m2,res) matx_multiply(3,m1,m2,res)
...
static inline void mat2_multiply(float mat1[static 2],
float mat2[static 2],
float result[static 2])
{
matx_multiply(2,mat1,mat2,result);
}
...