ポインタを値渡しする

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Iseuma14
記事: 54
登録日時: 10年前

ポインタを値渡しする

#1

投稿記事 by Iseuma14 » 9年前

質問させていただきます 
ポインタを値渡しすると実行速度等が変わるのか知りたいです
たとえば

コード:

#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は
やはり実行速度は変わってくるものなのでしょうか?

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

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

box
記事: 2002
登録日時: 14年前

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

#2

投稿記事 by box » 9年前

実行時間に差が出るかどうか気になるのであれば、
sum1()とsum2()を何億回も実行するようなコードを書いて、
時間を計ってみればよいでしょう。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#3

投稿記事 by みけCAT » 9年前

このコードを例えばGCC 4.8.1で-O2の最適化をかけてコンパイルすると、どっちも数値だけが違うコードにインライン展開されました。
実行速度を上げたければ、小手先の細かいことを考えるよりコンパイラに最適化させた方がいいでしょう。
それでも足りなければ、アルゴリズムを変えて計算量のオーダーを下げましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Iseuma14
記事: 54
登録日時: 10年前

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

#4

投稿記事 by Iseuma14 » 9年前

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

Iseuma14
記事: 54
登録日時: 10年前

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

#5

投稿記事 by Iseuma14 » 9年前

>>みけCAT様、いつも回答ありがとうございます
アルゴリズムはまだあまり学習していないので学習してからがんばります
ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る