与MKL一起使用的数组类型

时间:2015-05-11 08:40:37

标签: c++ arrays intel-mkl

我想使用英特尔的数学核心库进行一些矩阵操作和乘法。我已经阅读了英特尔的教程,下面是他们使用的数组示例:

A = (double *)mkl_malloc(m*p*sizeof(double), 64);

现在,我是C ++的新手,我必须编写几个将返回数组的函数,在全局函数中相乘。但我已经读过,除非你知道自己在做什么,否则返回数组上的指针是一个坏主意。我可以对此作一些澄清吗?如果可能,举个例子?

以下是我的想法:

double* pexpList(double first, double last, size_t n)
{
    double *vector;
    vector = (double *)mkl_malloc(n * sizeof(double), 64);
    double m = (double) 1 / (n - 1);

    if (first * last > 0.0) {
        double quotient = pow(last / first, m);

        vector[0] = first;
        vector[n - 1] = last;

        for (size_t i = 1; i < n - 1; i++)
            vector[i] = vector[i - 1] * quotient;
    }

    return vector;
}

1 个答案:

答案 0 :(得分:2)

你可以说有两种类型的数组:静态分配的数组,你通常称为数组的数组,并被声明为

double array[SOME_SIZE];

然后是第二种数组,它们是使用例如动态分配的。 malloc(或在您的情况下为mkl_malloc):

double *array = malloc(some_size);

这两种数组之间的最大区别在于,它(通常)在堆栈上分配了第一种类型的数组,并且可以使用sizeof来获取其大小,并且第二种类型是在堆上分配的,你需要自己跟踪它的大小(当完成它时也需要free)。

两种类型都可以使用完全相同,因为第一种类型的数组会衰减到指针,并且您可以使用带指针的数组索引语法。

关于从函数返回指针的事情是,如果将第一种类型的数组声明为函数内的局部变量,则一旦函数返回并且任何指针变为无效,该变量将超出范围。对于第二种类型,没有这样的问题,因为指向的内存不会超出范围,并且在您free内存之前有效。

举例说明:

double *function1(void)
{
    double array[SOME_SIZE];
    return array;
}

double *function2(void)
{
    double *ptr = malloc(SOME_SIZE * sizeof(*array));
    return ptr;
}

int main(void)
{
    double *ptr1 = function1();  // Invalid pointer
    double *ptr2 = function2();  // Okay pointer
}

function1函数将返回指向局部变量array的指针,但是一旦函数返回array超出范围,所以main变量ptr1不会指向有效的内存,以任何方式使用该变量,除非将其指向其他地方导致undefined behavior

但是function2返回指向程序生命周期内存在的动态分配内存的指针(或直到用指针调用free),这样指针才有效并且可以自由使用。