【发布时间】:2023-03-08 09:37:01
【问题描述】:
我知道在 Matlab 中,将新变量分配给现有变量时会进行“惰性”评估。如:
array1 = ones(1,1e8);
array2 = array1;
array1 的值不会被复制到array2,除非array2 的元素被修改。
由此我假设Matlab中的所有变量实际上都是值类型并且都是通过值传递的(尽管使用了惰性求值)。这也意味着变量是在调用堆栈上创建的。
好吧,我不是在评判它处理变量的方式,尽管我从未见过第二种编程语言这样做。我的意思是,对于可能较大的数据结构(例如数组),将其视为值类型并按值传递似乎不是一个好主意。尽管懒惰的评估节省了空间和时间,但对我来说似乎很奇怪。您可能有一个用于变异(而不是初始化或赋值)变量的表达式,从而导致内存不足错误。据我所知,在 C 中,数组名称实际上是指针,而在 Fortran 中,数组是通过引用传递的。大多数现代语言都将数组作为引用类型。
那么,谁能告诉我为什么 Matlab 使用这种不常见的方式来实现数组。在 Matlab 中,真的没有或不能在堆上创建任何东西吗?
顺便说一下,我已经询问了一些有经验的 Matlab 用户。他们只是说一旦创建变量他们就永远不会更改它,并使用函数调用来创建新变量。这意味着所有可变数据都被视为不可变的。用这种方式编程有什么收获或损失吗?
【问题讨论】:
-
我没有时间回答很长的问题,但 Matlab 并不总是按值传递参数。如果您执行
x=func(x)之类的操作,则Matlab 将通过引用传递它。如果您执行y=func(x)之类的操作,如果您不更改x中的func(),它将通过引用传递,但如果您这样做,它将通过值传递。您不能明确地这样做,因此,在编写函数时必须小心。从不更改变量似乎是一个糟糕的解决方案。那么它是一个变量呢? -
@Bernhard Matlab 通过引用传递函数,如
x=func(x),因为它的即时编译器将其视为内联函数,因此不会创建额外的调用堆栈(只要此函数不是嵌套函数)。这里改变一个变量意味着改变它的值,你当然可以将一个变量重新赋值给另一个值。 -
@Bernhard Matlab 处理变量的方式会让程序员非常仔细地编写代码,就像你说的那样。对我来说,将数组(或单元格)创建为值类型变量确实让我感到困惑和惊讶。因为如果没有完全理解它的语义,程序员永远不会知道他们什么时候会导致不必要的额外计算时间和空间。
标签: matlab lazy-evaluation pass-by-value value-type