1

忍受我这...

假设我有一个现有的结构:

<cfset struct1 = {key1 = "foo", key2 = "bar"}>

...我想添加一些键/值对。典型的方法是这样的:

<cfset struct1.key3 = "baz">
<cfset struct1.key4 = "qux">
<cfset struct1.key5 = "quux">

或者,我可以使用 structAppend():

<cfset struct2 = {key3 = "baz", key4 = "qux", key5 = "quux"}>
<cfset structAppend(struct1, struct2, false)>

...它还有一个额外的好处是允许我控制是否覆盖预先存在的键。我认为,缺点是它使用更多内存,因为新的键/值对最终将存在于两个不同的地方。但是如果我这样做呢:

<cfset structAppend(struct1, {key3 = "baz", key4 = "qux", key5 = "quux"})>

我是否消除了额外的内存使用?或者,在函数执行后,第二个参数的结构是否会继续存在于某个秘密位置——在这种情况下,我现在将内存浪费在一组我什至无法访问的冗余键/值上。

虽然我主要关心的是内存使用,但与第一种方法相比,知道最后一种方法是否有任何其他缺点(例如处理开销)可能不会有什么坏处。而且我意识到,我介绍的任何方法之间的资源使用差异在单个执行场景中都不会显着。我正在考虑更大的范围,有很多数据和/或很多重复。

如果这很重要,我目前正在使用 CF 9.0.1。

4

1 回答 1

1

是的,隐式结构将在内存中徘徊,直到下一次 GC 决定需要清理它。但它会与您的任何一个structAppend()示例一样创建。唯一的区别是,struct2如果内联执行,则永远不会创建引用。

我想如果在请求中间发生 GC,则内联版本将更快地成为被清理的候选者,因为将 - 隐含地 - 零引用仍在使用它,而如果你给它一个名字,就会有一个引用就在那里,直到请求结束后引用本身被破坏时,它才可用于 GC。

于 2013-09-09T08:10:02.573 回答