3

我试图通过并理解一个使用内在速度的卡方程序。在这个过程中,我遇到了一行我看不懂的代码。

我试过复习教科书、谷歌和搜索这个网站,但没有成功。我认为问题在于,在对语法一无所知的情况下,我无法用术语或关键字来充分描述搜索以获得任何相关结果。

这是我不明白的代码行:

float (*chi2_float)(const int, const float*, const float*) = chi2_baseline_float;

这是包含它的函数:

float chi2_float(const int dim, const float* const x, const float* const y) {
    float (*chi2_float)(const int, const float*, const float*) = chi2_baseline_float;
#ifdef __SSE__
    chi2_float = chi2_intrinsic_float;
#endif
    return chi2_float(dim, x, y);
}

在我看来,它可能是在声明和定义一个函数,当我注释掉该行并重新编译时,我得到:

错误 C2659:“=”:在 chi2_float = chi2_intrinsic_float 行上用作左操作数;

如果需要,我可以发送包含此函数的 .h 文件,但这与您对参数的期望一样。

任何帮助将不胜感激。

4

5 回答 5

11

有问题的行是根据 的值将函数指针类型的变量设置为其他两个函数之一__SSE__

然后调用 chi2_float 指向的函数并返回结果。

于 2012-11-17T22:10:43.337 回答
7

This:

float (*chi2_float)(const int, const float*, const float*)= chi2_baseline_float;

declares a function pointer names chi2_float and assigned to it a pointer to the function named chi_baseline_float.

Then, if the __SSE__ macro is defined, the pointer is reassigned with a pointer to the function chi2_intrinsic_float.

The net effect of all this is something similar to:

float chi2_float(const int dim, const float* const x, const float* const y) 
{
#ifdef __SSE__
    return chi2_intrinsic_float(dim, x, y);
#else
    return chi2_baseline_float(dim, x, y);
#endif
}
于 2012-11-17T22:15:04.717 回答
1

您的问题代码和一些评论:

// beginning of the definition of function chi2_float 
float chi2_float(const int dim, const float* const x, const float* const y) {
    // declare the variable chi2_float as a function pointer
    // set variable chi2_float to the address of the function chi2_baseline_float
    float (*chi2_float)(const int, const float*, const float*) = chi2_baseline_float;
// if macro __SSE__ is defined (if the compiler enables SSE instructions set)
// [this is your case because you got an error in the below line when you have commented the above line] 
#ifdef __SSE__
    // then preprocessor adds the following line that sets again the variable chi2_float (but to another function) 
    chi2_float = chi2_intrinsic_float;
#endif
    // call the function pointed by the variable chi2_float
    return chi2_float(dim, x, y);
}
于 2012-11-17T22:19:45.497 回答
1
float chi2_float(const int dim, const float* const x, const float* const y) {
   float (*chi2_float)(const int, const float*, const float*) = chi2_baseline_float;
#ifdef __SSE__
   chi2_float = chi2_intrinsic_float;
#endif
   return chi2_float(dim, x, y);
}

丑陋的。

修复此代码要做的第一件事是使用函数名称以外的其他名称作为函数指针变量的名称。我认为,这个变量掩盖了函数的名称是 James Crow 困惑的根源。

修复此代码的第二件事是完全摆脱函数指针,从而导致 Michael Burr 在他的答案中发布的代码。

于 2012-11-17T23:54:52.990 回答
1

Michael Burr 提出以下建议:

float chi2_float(const int dim, const float* const x, const float* const y) 
{
#ifdef __SSE__
    return chi2_intrinsic_float(dim, x, y);
#else
    return chi2_baseline_float(dim, x, y);
#endif
}

暂时忽略编译器的优化器;这可能会得到改善。Burr 先生的解决方案使用两个函数调用: main() (或其他)调用 chi2_float() 然后调用适当的实现。这可以简化为一个函数调用,如下所示:

#ifdef __SSE__
    #define chi2_float(dim, x, y) chi2_intrinsic_float(dim, x, y)
#else
    #define chi2_float(dim, x, y) chi2_baseline_float(dim, x, y)
#endif

通过将 Burr 先生的 chi2_float() 声明为“内联”,可能会获得相同的结果。

然而,回到现实世界(编译器积极优化代码),你会期望一个好的优化器删除额外的函数调用,从而使 Burr 先生的解决方案同样快。

为了完整起见,我发布了这个讨论。尽管这并没有改进 Burr 先生的解决方案,但它增加了更多的上下文。从技术上讲,它应该是一个评论,而不是一个新的答案,但不可能在评论中格式化源代码。这就是生活。

于 2012-11-18T01:48:15.217 回答