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。
网友评论