忍者ブログ

TAKE'S BLOG

プログラミングのどうでもいい話 その2

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

コメント

ただいまコメントを受けつけておりません。

プログラミングのどうでもいい話 その2

早速ですが、今回の題目変更です(笑)

パラメータを関数や手続き内であまり使わない方がいい
と言う方針で記事を書くつもりだったのですが、
最近の言語は値渡し、参照渡しなどがあって、
必ずしもパラメータを直接使うことによるロスが発生するとは限らないようです。

一部の言語はパラメータで渡された変数は、コピーされず、
呼び出し元の変数を直接参照しに行きました。
パラメータを使うたびに、メモリの別エリアを参照しに行くのです。
このオーバーヘッドを防ぐために、
パラメータの値は処理の先頭で、ローカル変数に移しました。


で、その代わりに、値渡しと参照渡しについてです。

値渡しはその名の通り「値で渡す」ことです。

Function FNC_A(ByVal pi_1 as integer,ByVal pi_2 as string,ByVal pi_3 as boolean) as boolean


pi_1,pi_2,pi_3は値渡しとして定義されています。呼び出す時は、

dim x as integer
dim y as string
dim z as boolean

x = 10
y = "サンプル"
z = false

ret = FNC_A(x,y,z)


まぁ、こんな感じですが、

実際に動くときは、x,y,zの内容はpi_1,pi_2,pi_3にコピーされます。
別物になるわけです。
したがって、pi_1,pi_2,pi_3に一生懸命代入しても、x,y,zは変化しません。

次に参照渡しです。


Function FNC_A(ByRef pio_1 as integer,ByRef pi_2 as string,ByRef po_3 as boolean) as boolean


pio_1,pi_2,po_3は参照渡しとして定義されています。呼び出す時は、

dim x as integer
dim y as string
dim z as boolean

x = 10
y = "サンプル"

ret = FNC_A(x,y,z)


pio_1,pi_2,po_3は参照渡しということで、その変数の場所が渡されます。
パラメータ(pio_1,pi_2,po_3)は変数(x,y,z)の場所を表し、
その内容を読みだすことも、書き換えることもできます。
つまり、値渡しとは違い、パラメータは変数そのものを指しているのです。

サンプルで説明すると、
pio_1は、入出力用のパラメータで、
xの値を読み出し、書き換える目的で定義されています。

pi_2は、入力用のパラメータで、
yの値を読み出す目的で定
義されています。
もちろん、pi_2の値を書き換えることも可能ですが、
ここはネーミングルールに従って書き換え不可と理解してください。

po_3は出力用パラメータで、
zの値を書き換えます。
出力パラメータなので、呼び出し元でzの値を設定する必要はありません。
設定してもよいのですが、ネーミングルールに従って、
その値は参照されることはありません。

さくっとこんな感じです。

これらから、po_,pio_は参照渡しでないといけないというルールが追加されますね。

ちなみに、pi_は値渡しだけにすればいいんじゃないか!?
という疑問も生まれると思いますが、
非常に大きな変数などを渡す時は、
コピーを作らない分、参照渡しの方が高速で動きます。
この辺を踏まえて設計するといいと思います。

拍手[0回]

PR

コメント

プロフィール

HN:
TAKE
性別:
非公開

P R