与 MKL 一起使用的数组类型
Array type to be used with MKL
我想使用 Intel 的数学核心函数库进行一些矩阵运算和乘法运算。我已经阅读了 Intel 的教程,这里是他们使用的数组示例:
A = (double *)mkl_malloc(m*p*sizeof(double), 64);
现在,我是 C++ 的新手,我必须编写几个函数,这些函数将 return 数组乘以全局函数。但是我已经读到,除非您知道自己在做什么,否则在数组上使用 return 指针是个坏主意。我可以澄清一下吗?如果可能的话,举个例子?
这是我的想法:
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
来获取它的大小,而第二种类型的数组分配在堆上,您需要自己跟踪它的大小(以及 free
完成后的大小)。
这两种类型可以完全相同地使用,因为第一种类型的数组会退化为指针,您可以对指针使用数组索引语法。
关于 return 从函数中获取指针的事情是,如果您将第一种类型的数组声明为函数内部的局部变量,一旦函数 return 该变量将超出范围s 和任何指向它的指针都变得无效。对于第二种类型,没有这样的问题,因为指向的内存不会超出范围并且在您 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
函数会return一个指向局部变量array
的指针,但是一旦函数returnsarray
退出范围,因此在 main
中,变量 ptr1
将不会指向有效内存,以任何方式使用该变量,除非将其指向其他地方,否则会导致 undefined behavior.
但是 function2
return 一个指向动态分配内存的指针,该内存在程序的生命周期内存在(或者直到您使用指针调用 free
),因此指针将有效,可以自由使用。
我想使用 Intel 的数学核心函数库进行一些矩阵运算和乘法运算。我已经阅读了 Intel 的教程,这里是他们使用的数组示例:
A = (double *)mkl_malloc(m*p*sizeof(double), 64);
现在,我是 C++ 的新手,我必须编写几个函数,这些函数将 return 数组乘以全局函数。但是我已经读到,除非您知道自己在做什么,否则在数组上使用 return 指针是个坏主意。我可以澄清一下吗?如果可能的话,举个例子?
这是我的想法:
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
来获取它的大小,而第二种类型的数组分配在堆上,您需要自己跟踪它的大小(以及 free
完成后的大小)。
这两种类型可以完全相同地使用,因为第一种类型的数组会退化为指针,您可以对指针使用数组索引语法。
关于 return 从函数中获取指针的事情是,如果您将第一种类型的数组声明为函数内部的局部变量,一旦函数 return 该变量将超出范围s 和任何指向它的指针都变得无效。对于第二种类型,没有这样的问题,因为指向的内存不会超出范围并且在您 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
函数会return一个指向局部变量array
的指针,但是一旦函数returnsarray
退出范围,因此在 main
中,变量 ptr1
将不会指向有效内存,以任何方式使用该变量,除非将其指向其他地方,否则会导致 undefined behavior.
但是 function2
return 一个指向动态分配内存的指针,该内存在程序的生命周期内存在(或者直到您使用指针调用 free
),因此指针将有效,可以自由使用。