DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

高度なレコード型-D2006以降新機能

さて、禁断の新機能使いになろうとしている漏れです。

      ブウォン
       {}    _____________
   ∧,,∧ {}   /
  ミ,,゚皿゚ミ|} < 暗黒面にくるのぢゃ
   U  ,,Φ   \
 @ミ  ミ       ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
   ∪''∪ コーホーコーホー


結構、萌え....いや、燃えます。熱いっす。

高度なレコード型は、D2006から導入されてるようですね。
Delphiテクニック - TStringListのシンプルな代替

この記事の解説については後日するよ。


レコードの初期化の問題対処のお勧め方法、
ありえない選択が書かれていておもしろい。
ダメダロそれ!ってつっこみたくなりますが、まあいいや。後日のネタに。


とりあえず、高度なレコード型についてのDelphiヘルプをみてみました。

どうせみるなら、chm形式のヘルプでみようか。


RAD Studio Help Update 1 CHM files - Japanese (山本隆の開発日誌)
http://www.gesource.jp/weblog/archives/2007/11/rad_studio_help_update_1_chm_f.html

Team Japan >> RAD Studio ヘルプアップデート 1 (CHM ファイル) をリリースしました
http://blogs.codegear.com/teamj/2007/11/29/58/

DEKOさんとこでも紹介されてますね。
http://homepage1.nifty.com/ht_deko/tech007.html

こんだけのファイルがあります
 delphivclwin32.chm
 devcommon.chm
 devnet.chm
 devwin32.chm
これって、Delphi2007IDEには組み込めないのかな?


まあ、高度なレコード型の項目をみてみましょう。
devcommon.chm ここにありました。



   ∧,,∧    ベンキョーベンキョー
  ミ,, ゚Д゚彡 
   〃つl⌒|⌒l
 ~ミ,,[ ̄ ̄ ̄.]
      ̄ ̄ ̄

いろいろ書いてあります。
> ・レコードは継承をサポートしません。
ふむふむ

> ・レコードは、デフォルトの引数なしコンストラクタを
> 使って自動的に作成されますが、クラスは明示的に作成
> する必要があります。レコードにはデフォルトの引数な
> しコンストラクタがあるため、ユーザー定義のレコード
> コンストラクタは必ず 1 つ以上のパラメータを持つ必
> 要があります。
> ・レコード型はデストラクタを持つことができません。

ニャ?!そうなんか!

> ・レコードは値型なので、グローバルに宣言されるか、
> New および Dispose 関数を使って明示的に割り当てら
> れていない限り、代入ではコピーされ、値によって受け
> 渡され、スタックに割り当てられます。クラスは参照型
> のため、代入でコピーされることはなく、参照によって
> 受け渡され、ヒープに割り当てられます。

おおおっと。

俺、Delphiばっかりやっていたので
実はヒープとかスタックとかって、意味が通じなかったりしてました。
Delphiでは、そこは意識せずに、そんな単語も使わずに使えるものね。

で、いまさらですがヒープとかスタックとかについて
よい勉強できるサイトがありましたのでご紹介。
つくる人の味方 Hello, ANOTHER world! ヒープメモリ
「すでに解説しました。」と書かれているページもしっかり見よう。きっとよくわかるよ。


さて、HELPの記述をみると、前記事の疑問

var
 sc: TStringConvert;
begin
 sc := TStringConvert.Create('123456');

sc はvarで宣言したと同時に TStringConvert が使用するメモリ領域を
全確保して、Createしても、その領域のメモリ領域を使うだけだから。
これは、メモリリークしてないね。

> 上記の場合
>  sc := TStringConvert.Create('123456');
> というのは
>  sc.Create('123456');
> と、等価なのかな?
> それとも入れ物が二つつくられてるのか?

これは、ある意味等価な動作をするはずです。
scのCreateを呼び出す動作は行われるし
scのメモリ領域に新しいscを作って入れてもメモリ領域は全く同じとこ使用。


それにしても、暗黙のCreateがあるとは…
自分で引数無しCreateを作ろうとしてもエラーではじかれます。
なかなか、、、こいつは、、、使い勝手が微妙じゃないか?

引数ありでもconstructor Create(…
これは混乱を引き起こしそうなので、俺は使わない事にします。
※どうせならVCLで高度なrecordに対するconstructorなんて記述を
 排除すればいいのに…言語デザインセンスを疑いつつ…

そして最もヤヴァーな件がこの後に控えてます。

これをふまえて、上で紹介している
『Delphiテクニック - TStringListのシンプルな代替』
これを見ると、おもしろい事がわかってきますよ。

おもしろそうなので、また次回。

ひっぱりますよー。
スポンサーサイト

| 未分類 | 01:57 | comments:2 | trackbacks:0 | TOP↑

COMMENT

C++っぽいですね。
スタック上にインスタンスが確保されたり、暗黙のコンストラクタがあるあたり。

| pik | 2008/01/22 16:44 | URL | ≫ EDIT

こんにちはー。

"スタック"上にインスタンス確保って意味がようやくわかりました。

"スタック""ヒープ"って言葉自体が
C++用語っぽくて嫌いだったのですが、わかってみると簡単ですね。

暗黙のコンストラクタも、C++にもあるんすね。自由度が高い方がちょっとうれしいっすよ。

| ミ・д・彡 | 2008/01/23 00:12 | URL | ≫ EDIT















非公開コメント

TRACKBACK URL

http://delfusa.blog65.fc2.com/tb.php/104-1e56ef9b

TRACKBACK

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。