【发布时间】:2016-06-06 05:09:13
【问题描述】:
所以目前我正在使用我为一个项目编写的一个小矩阵库,但我讨厌的是我需要使用临时变量来存储指向矩阵的指针以避免内存泄漏
例子:
matrix_t* matrix_add(matrix_t* m1, matrix_t* m2)
{
assert(m1 != NULL && m2 != NULL);
assert(m1->rows > 0 && m2->rows > 0 && m1->cols > 0 && m2->cols > 0);
assert(m1->rows == m2->rows && m1->cols == m2->cols);
matrix_t* sum = matrix_constructor(m1->rows, m1->cols);
int i, j;
for(i=0; i<m1->rows; i++)
{
for(j=0; j<m1->cols; j++)
{
matrix_set(sum, i, j, matrix_get(m1, i, j) + matrix_get(m2, i, j));
}
}
return sum;
}
如您所见,如果我想像 2 个矩阵相加 (A + B + C) 那样将操作链接在一起,那么我必须执行以下操作:
matrix_t* temp = matrix_add(A, B);
matrix_t* sum = matrix_add(temp, C);
free_matrix(temp);
当存在一长串操作时,这也会变得更加丑陋,因为每个操作都需要一个临时变量。我的问题是,有没有人有任何设计策略可以让我的生活更轻松,代码更简洁,能够链接操作并避免内存泄漏。
我想我可以发送带有可变长度操作的可变长度参数,但是当引入许多不同的操作(如矩阵转置和需要不同大小矩阵的操作)时,这可能会变得混乱。
【问题讨论】:
-
为
matrix_add定义第三个参数作为加法的结果?这样您就可以在两个matrix_t变量之间进行 ping pong。matrix_t r1, r2; matrix_add(A, B, &r1); matrix_add(&r1, C, &r2); matrix_add(&r2, D, &r1); matrix_add(&r1, E ,&r2);等 -
该解决方案并不能解决问题。我仍然必须在函数之外释放矩阵,并且在某些情况下我需要超过 2 个临时变量。矩阵加法并不是唯一需要链接的情况。
-
我个人认为调用函数来获取或设置矩阵元素有点过分。如果你愿意支付这么高的成本,那么我建议使用像 Python 这样的非编译语言。在 C 语言中这样做的唯一原因是为了速度,而您正在放弃这种优势。
-
问题是我正在为一堂课写它,我稍后会并行化它,所以作业的重点是学习。此外,代码将在 OpenMP、OpenMPI 和 Cuda 中并行化,它们都是 C 的副产品。你说得对,使用 getter 和 setter 是多余的,但我将来可以将它们变成宏,我只是不想处理就是现在。
-
传入一个matrix_t数组如何让函数一次性完成整个链?
标签: c matrix memory-leaks chaining