無差別に技術をついばむ鳥

情報処理技術全般を気まぐれに研究するブログです

C++/CLIをつつく26−引数の参照渡し。時には曖昧にしておくのがベスト。

今回は要望があったメソッド引数への参照引き渡しをつつくよ。メソッドへの値の渡し方は、 値引き渡し参照引き渡しの2つがあるんだ。 この2つの違いは、代名詞と固有名詞の違いと覚えておくといいピヨ。これはどういうことか現実の話しで例えるピヨ。
値渡しの場合は、「この原価計算報告書を部長に渡してね」と直接対象を指して言っているのと同じなんだ。一方参照渡しの場合は、「この書類部長に渡してね」と間接的に対象を指しているということなんだ。つまり、この2つの言い方の違いは、 替えが可能かどうかなんだ。 先ほどの例で言うと、原価計算報告書と違う書類を渡した時、 値引き渡しの場合は「おいおい○○。これ原価計算報告書じゃないぞ。」と注意されるのに対して、 参照引き渡しの場合は何も言われない。だって「書類」って曖昧に言っているからね。
何故このように2つの引渡し方法がC++/CLIにあるのかというと、 プログラムの柔軟性効率性を高めようとしているからなんだよ。 論よりもプログラミング。毎度御馴染みサンプルコードを実行してからよく見て。

#include "stdafx.h"
using namespace System;
using namespace System::Diagnostics;

ref class Program {
public:
	static double Calculate( Int32 value ) {
	    return value * 
                Convert::ToDouble( ( (DateTime^) DateTime::Now )->Ticks );
	}

	static void RefCalculate( Double% value ) {
		value *= 
                    Convert::ToDouble( ( (DateTime^) DateTime::Now )->Ticks );
	}
};

int main(array< System::String ^> ^args)
{
	Stopwatch^ watch = gcnew Stopwatch( );
	const Int32 max = 1000000;
	Double result = 0;

	//値引渡し
	watch->Start( );
	for(Int32 i = 0; i < max; i++) {
		result = Program::Calculate( i );
		//resultを使って何かの計算をする
	}
	watch->Stop();
	Console::WriteLine( 
		"値引渡し時の実行時間は{0}ミリ秒です。", 
		watch->ElapsedMilliseconds );

	//参照引渡し
	watch->Reset( );
	watch->Start( );
	for ( Double i = 0; i < max; i++ ) {
		result = i;
		Program::RefCalculate( result );
		//resultを使って何かの計算をする
	}
	watch->Stop( );
	Console::WriteLine( 
		"参照引渡し時の実行時間は{0}ミリ秒です。", 
		watch->ElapsedMilliseconds );
	return 0;
}

どう?値引渡しと参照引渡しどちらが速かった?この状況で参照引き渡しの方が速い理由は 同じ変数を使いまわせるからなんだ。 値引渡しの場合は実行環境が毎回値を作成しているから、何度も使いまわしする場合にはスピードが落ちるんだ。 だから、参照引渡しの使い方をマスターしておくと、より効率がいいプログラムが組めるんだよ。 何度も試してマスターしておこう。
でも正直に言うと、このサンプルのスピードは、引渡し方法だけではなくてボックス化が影響しているんだけど、それについては難しいから今後説明するピヨ。
説明終わり。ということでこの記事は終わり。
※C#の記事はここで終わっているけど、C++/CLIの場合、コンパイラオプションを最大限の最適化 (/Ox)にした時参照渡しの方が遅くなるから注意してね。 原因は今後調査しようと思っているピヨ。今度は本当に終わり。
別窓 | C++/CLI | コメント:4 | トラックバック:0 | ∧top | under∨
<<VB.NETをつつく26−引数の参照渡し。時には曖昧にしておくのがベスト。 | 無差別に技術をついばむ鳥 | C#をつつく26−引数の参照渡し。時には曖昧にしておくのがベスト。>>

この記事のコメント

> 代名詞と固有名詞の違い

...違うんじゃない?
「コピー(値)と原本(参照)の違い」じゃないかと。
2009-05-09 Sat 15:51 | URL | επιστημη #-[ 内容変更]
わざわざ、古い記事に指摘するとは、どういう意図ですか?
インドリを試してるの?
2009-05-09 Sat 16:30 | URL | n #-[ 内容変更]
> どういう意図

間違っていると思われるから。
2009-05-09 Sat 17:33 | URL | επιστημη #-[ 内容変更]
>間違っていると思われるから。

それは意図じゃなくて、指摘した理由でしょ。

過去の記事を見て粗を探し、わざわざ指摘した様に見えるんですけどね〜
2009-05-09 Sat 18:45 | URL | n #-[ 内容変更]
∧top | under∨

コメントの投稿

 

管理者だけに閲覧
 

この記事のトラックバック

∧top | under∨
| 無差別に技術をついばむ鳥 |