スクリプターズカフェ/ログ/Monoでのリスト変数の要素のデータ

ページ名:スクリプターズカフェ/ログ/Monoでのリスト変数の要素のデータ

Scripters_cafeログ

08/11/22[]

Monoコンパイルしたスクリプトで変数をリストに格納する場合、スクリプト内で静的に記述してある値は、同じ実体への参照としてリストに追加されるようです。

ただし、これはリストへの追加時と読み込みの時にこのようになっているだけで、特定の要素の値を書き換えた場合、書き換えられた部分は新しい実体になります。

【参考】Babbage Linden Office Hour 2008/09/17

Babbage Linden: the way collection operations workBabbage Linden: is that they copy references around where they canBabbage Linden: so, when you add an int or vector to a listBabbage Linden: it gets boxed in to an objectBabbage Linden: and then a reference to the object is stored in the listBabbage Linden: as you can't change the value while it's in a listBabbage Linden: if you copy the list aroundBabbage Linden: it just copies the referencesBabbage Linden: instead of copying the valuesBabbage Linden: so, if you put a string in a listBabbage Linden: then repeatedly copy the list or append it to another listBabbage Linden: the runtime copies a 4 byte reference to the stringBabbage Linden: instead of the (many byte) string itselfBabbage Linden: (it's kind of copy on write, yes)Babbage Linden: copy on unbox(簡単訳)コレクション操作は、可能な限り参照のコピーを行うように動作する。リストにintやvectorを追加すると、objectにボックス化された後、そのobjectへの参照がリストに保存される。なので、リスト中にある値を直接変更することはできない。リスト全体をコピーする場合、リスト中の値をすべてコピーするのではなく、それぞれの参照のみをコピーする。文字列をリストに追加する場合、リストの本体がまたコピーされるか、別のリストに文字列が追加される。(訳注:この部分正確に解釈できていませんが、要素を追加する場合は必ず新しくリスト全体が生成されるという意味だと思われます。)ランタイムは、文字列本体をコピーする代わりに、文字列への参照である4バイトだけをコピーする。(書き込み時コピーみたいなもの)ボックス化解除時コピー。
  • ボックス化/ボックス化解除とはCLIで使われる用語です。
  • →wikipedia ボックス化

この挙動はLSL2とは大きく異なります。LSL2では、リストの要素のすべてが実体を持っており、またコピー時も実体がすべてコピーされていました。

検証スクリプト[]

以下のスクリプトは、リストに動的要素を追加し続けるものです。1400件程度追加されたところで、Stack-Heap collisionエラーが発生します。

default{ state_entry() { string data = "テスト"; list li; integer cnt; @loop; { li += llStringTrim( data, STRING_TRIM ); ++cnt; llSetText((string)cnt + "/" + (string)llGetFreeMemory(), <1.0, 1.0, 1.0>, 1.0); } jump loop; }}

これを、以下のように静的な要素を追加し続けるようにすると、7600件程度まで追加できてしまいます。

default{ state_entry() { string data = "テスト"; list li; integer cnt; @loop; { li += data; ++cnt; llSetText((string)cnt + "/" + (string)llGetFreeMemory(), <1.0, 1.0, 1.0>, 1.0); } jump loop; }}

前者では、スクリプト内で(llStringTrimの実行によって)生成された動的な文字列(ループの度に新しい要素が生成される)への参照がリストに格納されます。リストに格納されているデータとは別に、動的に生成された文字列データもすべてメモリに格納されます。

これと比較して後者は、格納する文字列の本体は1つだけで、リストの要素(文字列への参照)のみが増えていきますので、前者よりもたくさんの要素を格納できています。


全く同じ値をリストに大量に追加する場面は実際にはまれなので、この仕組みを理解してメモリ効率を挙げるような一般的なテクニックというのは難しいですが、リストにNULL_KEYや空文字列を何度も投入する可能性があるなら、グローバル変数で定義したものをリストに追加するように書くと少しは効果があるかもしれません。

★そのために判定処理コードが増えてしまったりしては本末転倒ですが。


このページのTinyURL:http://tinyurl.com/SC-List-element-reference



特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。

シェアボタン: このページをSNSに投稿するのに便利です。


最近更新されたページ

左メニュー

メニュー 用語集&nbsp;- これはどういう意味?用語解説 Q&A&nbsp;- よくある質問、定番解説、公式サポートに関する情報 トラブル・シューティング&nbsp;- トラブル・シューティング情...

顔文字

すでに日本の文字文化の仲間入りしたグラフィックを駆使しない表現手段。これが英語と日本語で違う。基本的に英語の顔文字は横向き。最初、わからなかったのが、この2つ...

銀行業務に関する判断・事例

2008年1月22日より施行される「銀行」に関する判断事例をまとめます。これらは「参考」であり、これによって「判断」をするものではありません。個々に記載されていない背景がある場合もありますので判例とは...

都市伝説&うわさ

目次1 Rumor & urban legend1.1 セカンドライフ全人口のうち3割はボット、半数は未使用のアカウントらしぃ1.2 キャッシュはまめにクリアしたほうがよい?1.3 支払い情報がないと...

身長

意外と知られていないが、AVの身長を計れる。llGetScaleのvectorのzを使う。ただし、靴などは脱いで計ること。SL内では2m前後が普通なようで まじめに計って 160cm程度にしたとある人...

設定

Second Lifeでは、様々な設定を行うことができます。「編集」→「環境設定」か、Ctrl + Pで呼び出せます。特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用...

複数アカウントの管理

このページの内容は公式 Knowledge Base「Alt Account FAQ」を翻訳、一部補足したものです。内容は予告なく変更される場合があるため契約を行う際は原文を確認するようにお願いします...

英語

RL/SLを問わず、世界標準語(なのか?)。人口比率的に、普通に生活していると英語を話す機会は多い。英語chatの参考に...ねっとげーむのえいかいわ。ちなみにある人の変遷 (ある人は、高卒程度の英語...

略語

日本語ほど省略しまくる言葉もないと思っていたら英語には勝てませんでした...例えば...lollaugh over laud大笑いbrbbe right backすぐもどるhbhurry back早く...

用語集

すごい作りかけです。みなさん、御協力お願いします。SIMSL内で作成される島のこと。LSLLinden Script Languageのこと。これで、オブジェクトやアバターを操作出来る。アバターSL内...

最近の出来事

最新情報です[]パスワードの盗難事件等発生していますいので、パスワードの再確認をお願いします。 --Keiji 2007年6月17日 (日) 16:46 (UTC)特に記載のない限り、コミュニティのコ...

日本人向けSIM

ここでは、日本人向けSIM(日本人利用者が多い、日本人が運営しているSIM)を並べていきます。特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

換金

日本円 →(US$)→ L$ / L$ →(US$)→日本円といった流れで換金が可能。リンデンラボ公式LindeXのみ。その他の方法Paypal経由でサードパーティを利用。例:ANSHECHUNG.C...

太陽

太陽を動かすことも可能。SLの太陽(及び月)は動くので、明るさも当然変わる。暗くなると見えにくいため、太陽を出して明るくすることもできる。メニューバーから以下の操作でコントロール。World - Fo...

外部サイトリンク

活動の軸が外部にある関連のリンク。ニュース、技術資料、ツール、サービスなど。イン・ワールドで活動している団体の説明 HPなどはこちらではなくイン・ワールド系リンクへ記載してください。目次1 ニュース1...

基本操作

初心者講座 > 基本操作ここでは、基本操作を解説します。画面の見方[]キーボードによる操作[]カメラ操作[]特に記載のない限り、コミュニティのコンテンツはCC BY-SAライセンスの下で利用可能です。...

土地の種類・分類

目次1 土地の種類2 土地の購入2.1 メインランドで土地を購入する場合2.2 プライベート・アイランドで土地を購入する場合2.3 レンタルとは?3 その他注意事項土地の種類[]セカンドライフにおいて...

土地

SL内では土地を売買・賃貸できる自分の(または所属するグループが)土地をもつと、そこを Homeとして設定できる。(CTRL+SHIFT+Hで、すぐに帰れる場所になる)土地のプリム数の範囲内で、家など...

右クリック

パイ・メニューを開いてその人や物に対して何か行う操作。何かしたい/情報を知りたいという時は、右クリックすべし。macな人に「右クリックないんですけど…」と質問されるのは定番。Optだったかを押しながら...