我正在创建一个矩阵库,它有很多类似这样的函数(实际上是一个很长的函数):

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/

10-12 07:27
查看更多