矩阵库:内联与定义

时间:2014-11-19 12:25:32

标签: c optimization

我正在创建一个矩阵库,其中包含一堆像这样的函数(它实际上很长):

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是否为浮点数)
  • 第二种方式更安全,它可以验证阵列的长度,但它不那么简单,可能无法扩展......

你会做什么,你想要一个矩阵库做什么?

我希望我的库能够快速(对于OpenGL应用程序),相当小且易于使用。

1 个答案:

答案 0 :(得分:0)

使用inline关键字。如果使用预处理器开发类似函数的宏,有几个缺点:

  • 没有类型安全检查
  • 没有健全性检查
  • 糟糕的调试
  • 糟糕的可读性
  • 传递给宏的表达式的评估可以超过once