我正在创建一个矩阵库,它有很多类似这样的函数(实际上是一个很长的函数):
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];
}
}
}
}
首先,我想知道如果在一个程序中使用了~5次(通常是在一个循环中),并且在编译时已知
inline
函数,那么将它改为x
函数是否更好。我认为最好
inline
它,这样编译器就可以在编译时决定是否要在代码中扩展它(取决于优化参数)此外,如果编译器知道x
,它可能会非常好地优化循环(例如,如果x=2,它可能会决定展开循环)更重要的是,我想添加一组函数:
#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);
}
...
或者创建一个函数(但是它创建了一个函数调用,但没有任何意义)
一种方法要简洁得多,而且总是扩展的(它将验证mat1和mat2是否是float数组)
第二种方法更安全,它验证数组的长度,但不太简洁,可能无法扩展。。。
你会做什么,你想让矩阵库做什么?
我希望我的库相当快(对于OpenGL应用程序),相当小且易于使用。
最佳答案
使用inline
关键字如果使用预处理器开发宏之类的函数,有几个缺点:
无类型安全检查
没有健全的检查
调试不好
可读性差
传递给宏的表达式的计算值可以大于once
关于c - 矩阵库:内联与定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27016796/