c++ - 与 MKL 一起使用的数组类型

标签 c++ arrays intel-mkl

我想使用 Intel 的数学核心函数库进行一些矩阵运算和乘法运算。我已经阅读了 Intel 的教程,这里是他们使用的数组的示例:

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;
}

最佳答案

你可以说有两种类型的数组:静态分配的数组,也就是你通常所说的数组,声明方式如下

double array[SOME_SIZE];

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

double *array = malloc(some_size);

这两种数组之间最大的区别是,对于第一种类型的数组,它(通常)分配在堆栈上,您可以使用 sizeof 来获取它的大小,而第二种类型的数组类型在堆上分配,您需要自己跟踪它的大小(并在完成后释放它)。

这两种类型可以完全相同地使用,因为第一种类型的数组会退化为指针,并且您可以对指针使用数组索引语法。

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


举例说明:

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),因此指针将有效并可以自由使用。

关于c++ - 与 MKL 一起使用的数组类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30163087/

相关文章:

c++ - 通过参数传递变量并在稍后的类中对其进行修改

php - 检查网站是否包含字符串

c++ - 如何对存储为 "Compressed Sparse Row"的矩阵进行稀疏矩阵索引?

C++ 期望常量表达式

c++ - 将 zlib 用于 std::string 和 stringstream

c++ - lexical_cast strtof strtold 失去准确性?

c# - 从文本文件中提取数组

arrays - 如何在 Swift 的变量存储属性中存储不可变数组?

multithreading - 请问 `mkl_set_num_threads`是CPU Threads数的上限吗?

matrix - 查找大(稀疏)矩阵的特征值和特征向量