C 矩阵库:内联vs定义

C 矩阵库:内联vs定义,c,optimization,C,Optimization,我正在创建一个矩阵库,其中包含一系列函数,比如这个函数(实际上是一个很长的函数): 或 或者创建一个函数(但它创建一个函数调用却不需要任何东西) 一种方法更简洁,并且总是被扩展(它将验证mat1和mat2是否仍然是浮点数组) 第二种方法更安全,它验证数组的长度,但不太简洁,可能无法扩展 你会做什么,你希望矩阵库做什么 我希望我的库相当快(对于OpenGL应用程序),相当小并且易于使用。使用内联关键字。如果使用预处理器开发类似宏的函数,则有几个缺点: 无类型安全检查 无健全性检查 调试不好

我正在创建一个矩阵库,其中包含一系列函数,比如这个函数(实际上是一个很长的函数):

或者创建一个函数(但它创建一个函数调用却不需要任何东西)

  • 一种方法更简洁,并且总是被扩展(它将验证mat1和mat2是否仍然是浮点数组)
  • 第二种方法更安全,它验证数组的长度,但不太简洁,可能无法扩展
你会做什么,你希望矩阵库做什么


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

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

  • 无类型安全检查
  • 无健全性检查
  • 调试不好
  • 可读性差
  • 传递给宏的表达式的计算次数可以超过

为典型用例编写测试,并进行基准测试。如果编译器扩展了函数,它应该与define相同,如果没有,它应该与简单的函数声明相同。。。此外,我必须为每个函数做一个基准测试。我更想知道一个目标是相当快和小的矩阵库是否应该内联它的函数。也许还有其他我还不知道的优点/技术*类型安全性是确保的,因为宏将被扩展为对max_multiply(…)的简单调用,而max_multiply不是宏。*在我看来,内联函数的可读性不是更好。在这种情况下,你能开发你的参数吗?如果你这样认为,你可以使用预处理器。在你的情况下我不会这么做。是的,调试和宏相关的副作用让我更喜欢内联。谢谢:)
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);
}
...