ページ 11

ポインタを値渡しする

Posted: 2016年3月28日(月) 22:58
by Iseuma14
質問させていただきます 
ポインタを値渡しすると実行速度等が変わるのか知りたいです
たとえば

コード:

#include <stdio.h>
struct test
{
	int a;
	int b;
	//残りの要素省略
};

void sum1(test*);
void sum2(test**);

int main()
{
	test hoge;
	hoge.a = 10,hoge.b =5;
	test *piyo;
	piyo = &hoge;
	sum1(piyo);
	sum2(&piyo); 
	return 0;
}

void sum1(test *piyo)
{
	//ここに処理が入ります
	printf("%d\n",piyo->a);
}

void sum2(test **piyo)
{
	//同じく処理が入ります
	printf("%d\n",(*piyo)->b);
}
というプログラムがあったとき、
構造体のポインタ変数を値渡ししているsum1変数と
構造体のポインタのアドレスをさらにポインタに入れ込んでから処理を行うsum2は
やはり実行速度は変わってくるものなのでしょうか?

それともポインタはアドレスをさすものなので思いのほか重くないとかあるのでしょうか?

初歩的な質問かもしれませんがよろしくお願いします

Re: ポインタを値渡しする

Posted: 2016年3月28日(月) 23:10
by box
実行時間に差が出るかどうか気になるのであれば、
sum1()とsum2()を何億回も実行するようなコードを書いて、
時間を計ってみればよいでしょう。

Re: ポインタを値渡しする

Posted: 2016年3月29日(火) 00:40
by みけCAT
このコードを例えばGCC 4.8.1で-O2の最適化をかけてコンパイルすると、どっちも数値だけが違うコードにインライン展開されました。
実行速度を上げたければ、小手先の細かいことを考えるよりコンパイラに最適化させた方がいいでしょう。
それでも足りなければ、アルゴリズムを変えて計算量のオーダーを下げましょう。

Re: ポインタを値渡しする

Posted: 2016年3月29日(火) 21:33
by Iseuma14
>>box様、ご回答ありがとうございます
構造体のメンバ変数をそれぞれかなり大きい配列にして値渡しとポインタを使った参照渡しをそれぞれ一億回ループさせてみたところ
どちらもほとんど4.4~4.5秒ほどだったのでほとんど差はないという結論に自分の中でまとまりました
ありがとうございました

Re: ポインタを値渡しする

Posted: 2016年3月29日(火) 21:38
by Iseuma14
>>みけCAT様、いつも回答ありがとうございます
アルゴリズムはまだあまり学習していないので学習してからがんばります
ありがとうございました