美文网首页收藏js css htmlSAP 实用篇
简单聊聊 ABAP 变量消耗的内存空间这个话题的试读版

简单聊聊 ABAP 变量消耗的内存空间这个话题的试读版

作者: 华山令狐冲 | 来源:发表于2023-01-08 21:04 被阅读0次

本教程之前的文章介绍了 ABAP 调试器的用法:

有朋友向我咨询:ABAP 调试器里变量显示标签里,如果对于一个内表变量,Val 栏下的 [1x3(28)]Standard Table 是什么意思?

为了准确回答这个问题,我们就得简单了解下 ABAP 程序里的变量,在运行时消耗的内存空间这个问题。

在本教程第四篇文章,我们学习了 ABAP 编程语言里基本的数据结构:

看下面这段简单的代码:

REPORT z.

DATA: lv TYPE c LENGTH 10.

lv = '1234567890'.

WRITE:/ lv.

调试器里 Technical Type 显示的值 C(10),意思是变量 lv 的类型为 C 类型,即 定长的 Character 字符类型。10 表示这个变量的固定长度为 10.

在 ABAP 帮助文档的 Predefined Character-Like Type 这一章节,明确提到:

When specifying lengths for character-like types, note that the length of a character in bytes depends on the character representation used. The length of a character is two bytes for the character representation UCS-2 used by the ABAP programming language.

意思是一个字符需要占据两个字节,这是因为 ABAP 编程语言采取了 UCS-2 字符集。关于 ABAP 字符集的更多深入介绍,请参阅笔者这篇文章:ABAP 调用第三方 API,遇到乱码该怎么办?

所以上面例子的 lv 变量,运行时占据的字节数是 10 × 2 = 20 字节。

对于字符串变量和内表变量来说,因为它们的内容在运行时可以动态扩展,比如字符串变量的尾部不断添加新的其他字符,或者内表不断插入新的记录,因此字符串变量和内表变量在运行时占据的内存空间也会动态变化。

回到本文开始的疑问。

看这段简单的 ABAP 代码:

TYPES: BEGIN OF ty_data,
         name  TYPE c,
         age   TYPE c LENGTH 2,
         score TYPE c LENGTH 11,
       END OF ty_data.

DATA: ls_data TYPE ty_data,
      lt_data TYPE TABLE OF ty_data.

ls_data-name = 'c'.
ls_data-age = 'ab'.
APPEND ls_data TO lt_data.

定义了一个内表变量 lt_data, 其行类型为一个结构,包含名叫 name,age 和 score 这三个字段,字段类型都为 c,长度分别为 1,2 和 11.

既然都是固定的字符类型,那么内表每一行占据的内存空间为 ( 1 + 2 + 11 ) × 2 = 28 字节。

所以 [1x3(28)]Standard Table 里的1,代表当前内表的记录数,3 代表每条记录的列数或者说字段个数,28 代表每条记录占据的字节大小。

这只是最简单的情况,当每一行的记录里的字段类型不是 c 这种固定长度类型,而是诸如字符串 String 或者内表类型时,消耗的内存空间计算逻辑更趋于复杂。

当我们给行类型定义增添一个类型为 string 的字段 content 之后,我们发现每行占据的内存空间,从 28 个字节增加到了 36 个字节,多出来 8 个字节。

虽然我们尚未给 content 字段增添任何内容,这个字段包含的是空的初始值。那么这多出来的 8 个字节是做什么用的?

SAP 官网也有明确文档:

As long as no dynamic memory is requested, the memory requirement for a string, internal table, or boxed component is exactly 8 bytes.

一个空的字符串和内表变量占据的内存空间固定为 8 个字节。

本文余下部分,详细介绍这张图。

相关文章

网友评论

    本文标题:简单聊聊 ABAP 变量消耗的内存空间这个话题的试读版

    本文链接:https://www.haomeiwen.com/subject/ywuucdtx.html