ABAP 动态内存对象是其大小在设计时由数据类型申明设置的对象。除非更改程序代码自身,否则程序中此类变量占用的内存不会更改。
在 ABAP 术语中,动态变量也称为 flat variable
或 flat Component
.
上面是这种类型的变量在 ABAP Memory Inspector 里显示的例子:
值语义 (Value semantics) 和援用语义 (reference semantics) 形容了动态内存对象在多个变量援用它时的两种行为形式。
用于特定类型的动态内存对象的语义对该类型的对象应用内存的形式产生重要影响。
实质上,应用值语义的援用变量总是有它本人的、惟一的它所援用的内存对象的正本。值语义变量相似于动态变量;像动态变量一样,它间接绑定到它所代表的内存对象。只管变量只是一个援用,但从语义上讲,它是内存对象自身。
相比之下,应用援用语义的援用变量被了解为指向内存对象的指针。内存对象在语义上独立于援用变量。对象能够在许多这样的变量之间共享。
应用值语义解析对 ABAP 外部表、字符串或 boxed Component 的多个援用。
- 外部表、字符串或 boxed Component 的每个变量都指向它本人的内存对象的独自正本。
- 将表、字符串或 boxed Component 调配给第二个 ABAP 变量会触发对象的复制操作,以便每个变量都有本人的对象正本。
- 通过特定变量对外部表、字符串或 boxed Component 所做的更改,对于已调配给同一对象的其余变量是不可见的。
看个具体的例子:
DATA t1 TYPE STANDARD TABLE OF xyz.
DATA t2 TYPE STANDARD TABLE OF xyz.
DATA t_wa type xyz.
...
t2[] = t1[].
从语义上讲,T1 和 T2 各自有本人的内表公有正本。因为 ABAP 的惰性复制 (lazy copy) 策略,T1 和 T2 以后都指向内存中的单个外部表。如果表有 1000 行,长度为 20 字节,那么当初拍摄的 memory snapshot 将显示 20 KB 的动静对象内存,即一个表的大小。
如果当初将 T_WA 工作区附加到其中一个表,下一个快照将显示动静对象的内存将增加一倍以上。
APPEND t_wa TO t1.
起因:对 T1 的更改意味着 ABAP 最终必须实现为 T2 创立表正本。
当初 t1 和 t2 都有本人的公有动态内存对象。
T1 的表也比 T2 的表多一行。
当 APPEND 产生时,ABAP 看到表的援用计数器的值为 2,须要复制动态内存对象(表体)。
在 APPEND 之后,表的每个正本的援用计数器值为 1。