【发布时间】:2013-07-03 14:31:24
【问题描述】:
假设我有一个 A 类型的对象。考虑这种情况,适用于 A -> A 类型的任何函数(即获取 A 类型的对象并返回另一个 A 类型的对象):
foo = func(foo)
在这里,最简单的情况是将func(foo) 的结果复制到foo。
是否可以对此进行优化:
-
foo在func中就地修改
对使用的语言没有限制。我想知道的是语言必须具有哪些约束和属性才能实现这种优化。是否有任何现有的语言可以执行这种优化?
示例(伪代码):
type Matrix = List<List<int>>
Matrix rotate90Deg(Matrix x):
Matrix result(x.columns, x.rows) #Assume it has a constructor which takes as args the num of rows, and num of cols.
for (int i = 0; i < x.rows; i++):
for (int j = 0; j < x.columns; j++):
result[i][j] = x[j][i]
return result
Matrix a = [[1,2,3],[4,5,6],[7,8,9]]
a = rotate90Deg(a)
在这里,是否可以优化代码,使其不为新矩阵(结果)分配内存,而只是修改传递的原始矩阵。
【问题讨论】:
-
当然,当你内联函数调用时,你可以做到这一点,甚至更多。
-
您能否详细说明内联函数如何帮助使函数就地生成?谢谢。
-
考虑
func(x) = x * 2和代码foo = func(foo)。内联后是foo = foo * 2,在普通处理器上可以用ADD r1, r1这样的单指令实现。在更复杂的情况下也有可能,特别是如果foo的地址不是"escape"。 -
在类 C 语言中,func 可以获取指向 foo 的指针,对 foo 进行操作并直接写回 foo。
void func(int* foo) { (*foo) += 10; }。 C# 对ref参数执行相同的操作。这就是你的意思吗? -
@antiduh 不,我不是这个意思。我编辑了问题并添加了一个示例。