LSL Script Memory/ja

From Second Life Wiki
Jump to navigation Jump to search

スクリプトの容量

LSLにおける全てのスクリプトは16KBのメモリを使って動作し、あっというまに使い切ります。次にあるのはコードのメモリ消費量に関する一覧です。

以下のデータ全てはllGetFreeMemory()を通して観測したものです。LSLコンパイラは単純なプログラムではないため、これらのデータを実際に調整用として、十二分に用いることできるかは疑わしいです。

さらに数ビット、及びそれ以上の改善ができる手段があります。もし暇な時間があってどうすればいいのかわからなければ、さまざまな関数のメモリ消費量周りを調べましょう。このページの終わりまで掲載されているリストを必要に応じて更新しましょう。

変数

変数をグローバルで宣言する

変数のメモリ消費量

integer  10
float    10
string   18 + 1 per character
key      18 + 1 per character
vector   18
rotation 22
list     21 + list memory usage

リストのメモリ消費量

integer  15
float    15
string   12 + 1 per character
key      12 + 1 per character
vector   23
rotation 27
list     Lists Can Not Contain Lists

default stateの内部で変数を宣言する

変数のメモリ消費量

integer  15
float    15
string   12 + 1 per character
key      12 + 1 per character
vector   31
rotation 39
list     15 + list memory usage

リストのメモリ消費量

integer  7
float    7
string   4 + 1 per character
key      4 + 1 per character
vector   23
rotation 30
list     Lists Can Not Contain Lists

初期値

スタックに入る値

Integers 1 + 4 bytes for the value
Float    1 + 4 bytes for the value
String   1 + bytes for characters + 1 byte for null
Key      1 + bytes for characters + 1 byte for null
Vector   1 + 3 * float cost
Rotation 1 + 4 * float cost
List     1 + 4 for list length + list memory usage

スタックから除去するためのコストは1byteです。

リストのメモリ消費量

Integers 7
Float    7
String   4 + 1 per character
Key      4 + 1 per character
Vector   23
Rotation 30
list     Lists Can Not Contain Lists

定数

全てのinteger定数はメモリを6byte使用します。

その他の定数

ZERO_VECTOR   16
ZERO_ROTATION 21
NULL_KEY      39

例外

6byte分を参照する変数

integer i; //10 bytes

default {
 state_entry() {
  list l = ["Testing", "This"] //15 (list) + 15 (string) + 8 (string)
 }
}

関数

関数の宣言

関数は作成されるときに16byte、各パラメータと返り値の型にそれぞれ3byte必要とします。

返り値の型

integer  4
float    4
string   4
key      4
vector   20
rotation 27
list     4

関数内の変数として宣言

変数のメモリ消費量

integer  11
float    11
string   8 + 1 per character
key      8 + 1 per character
vector   19
rotation 23
list     11 + list memory usage

リストのメモリ消費量

integer  7
float    7
string   4 + 1 per character
key      4 + 1 per character
vector   23
rotation 30
list     Lists Can Not Contain Lists

関数の呼び出し

返り値なしの関数呼び出しには21byte、なんらかの返り値のある関数呼び出しには21byte。 引数の数を含めます。

返り値の型

integer  2
float    2
string   10 + 1 per character returned
key      10 + 1 per character returned
vector   2
rotation 2
list     18 + list memory usage

list f() {  //16 (function) + 4 (return)
    list ret = [0]; //11 (list) + 7 (integer)
    return ret; 6 (list)
}  
string f() {
    return "";
}

default {
    state_entry() {
        f();   //21 (call to f) + 10 (returns string)
    }
}

演算子

演算子一覧

+  1
-  1
*  1
/  1
%  1
&  0
|  0
^  0
!  0
>> 0
<< 0
~  1
== 1
<= 1
<  1
>= 1
>  1
!= 1

代入

変数への値の代入には総バイト数から1引いた分を使用します。

string s; //12 bytes
s;        //6 bytes
"";       //3 bytes (see below)
s = "";   //8 (6 (string) + 3 (null string) - 1) bytes

しかしながら...

string s = ""; //12 bytes
integer i; //15 bytes
i = i + 1 // 6 bytes (integer) + 6 bytes (integer) + 6 bytes (1) + 1 byte (addition) - 1 byte (assignment)

ステートメント

if    6
while 11
for   11
do    6
jump  5
@     0
state 5

if (5 < 10) { // 6 (if) + 6 (integer) + 6 (integer) + 1 (compare)
//Do something here
}
while (1 < 2 & 3 < 4) { // 11 (while) + 4*6 (4 integers) + 2 (2 compares)
//Do something here
}

タイプキャスト

integer  10
float    10
string   10
key      10
vector   10
rotation 10
list     25

ステート

ステート内におけるいずれかのイベントに14byte、各パラメータ毎に+1、新しいステートを作成する際に17byte必要です。

更新に必要なもの

このページに幾つかアップデートが必要な場合、最も必要なものを以下に挙げます。

  • 検証用の全データ
  • 明確な説明
  • 明確な関数の動き
    • 関数の呼び出し
    • 返り値の型がどんな結果を返すか
  • 以下のコードで、llGetFreeMemory()を呼び出して返ってくるさまざまな値。どんな影響がありましたか?また、それはなぜ?
default {
     state_entry() {
          llOwnerSay((string)llGetFreeMemory());
          list l = ["", "", "", ""];
          llOwnerSay((string)llGetFreeMemory());
     }
}