C言語関係掲示板

過去ログ

No.281.ポインタを使うと速くなる?

[戻る] [ホームページ]

No.1678

ポインタを使うと速くなる?
投稿者---きくりん(2002/06/07 15:09:52)


みなさん。はじめまして。C言語を勉強して2ヶ月ほどになります。
やっとポインタがおぼろげながらもわかってきたところです。
でも、まだ、よくわからないことがあります。
それは「配列よりポインタを使ったほうが処理が速くなる」ということです。
どのような場合にこのようなことがいえるのでしょうか?
それとも単なる噂なのでしょうか?
これを会社の先輩に質問したのですが、納得のいく答えは得られませんでした。
先輩のC言語の知識も怪しいものだなと疑惑をもちはじめました。
どなたか、「このような場合だよ」とソースつきで教えていただけないでしょうか。

転職したばかりで、給料が安いため昼食は毎日ラーメンでしのいでます。
一日でも早くC言語を習得し、給料を稼いで、ラーメン生活から脱出したいです。


No.1679

Re:ポインタを使うと速くなる?
投稿者---ともじ(2002/06/07 17:08:34)


こんにちは。

>それは「配列よりポインタを使ったほうが処理が速くなる」ということです。
>どのような場合にこのようなことがいえるのでしょうか?

とりあえず、過去ログのここはどうでしょうか。「ポインタの存在理由

No.1680

Re:ポインタを使うと速くなる?
投稿者---きくりん(2002/06/07 17:51:31)


ともじさん。早速のコメントありがとうございます。

教えて頂いた過去ログをこれからじっくり読んで理解したいと思います。
これからは、質問する前には、まず過去ログに同様のものがないか確認する
よう気をつけます。ありがとうございました。


No.1686

Re:ポインタを使うと速くなる?
投稿者---kikk(2002/06/08 02:03:56)


ども。


>とりあえず、過去ログのここはどうでしょうか。「ポインタの存在理由

リンク先の例はややポインタ有利のように書いてあるので、バランスを
取るために、配列擁護論を。

配列の場合、アクセス範囲が限られているため、コンパイラがキャッシュの
サイズを考慮したような(メモリアクセスの)最適化ができる可能性があります。

また、リンク先でインデクス計算時の乗算についてふれられていますが、
構造体以外の配列の場合は要素のサイズが2のべき乗になるため、(最適化
時に)シフトに減次することができます。


どっちがいいかは一概にはいえないので、速度が必要なときは、実際に
計ってみて速い方を採用し、そんなに速度の要求が厳しくないときは、
読みやすい方を採用するのがよろしいかと。


最後に、リンク先のNo.605のコードについてひとつ注意を。
一見、ポインタと配列の比較に見えますが、関数に渡してしまっているため、
実際はどちらもポインタです。関数を呼び出し側に展開した方が、配列と
ポインタの比較としてはより適切になるとおもいます。


では。

No.1708

Re:ポインタを使うと速くなる?
投稿者---ともじ(2002/06/09 23:17:02)


kikk、こんばんは。いつも書き込みありがとうございます。

>最後に、リンク先のNo.605のコードについてひとつ注意を。
>一見、ポインタと配列の比較に見えますが、関数に渡してしまっているため、
>実際はどちらもポインタです。関数を呼び出し側に展開した方が、配列と
>ポインタの比較としてはより適切になるとおもいます。

それが何故かはわからなかったのですが、No.605の関数にした部分を
呼び出し側に展開するとポインタを用いた方が却って時間がかかりました。
そこで、あのような例を提示しました。
実のところ、最近の処理系ではポインタは配列より遅いのかもしれません。
(断言するわけではありませんが)

No.605より
>>ポインタで処理をした方が速くなるのは、関数の引数に使った場合で、
>>単に同一関数内で配列と使い比べた場合は、ループ変数以外にポインタ
>>自身のインクリメントが必要になるなど、かえってポインタの方が遅い場合
>>ばかりでした。
>>関数の引数に指定した場合もコンパイラによって違いがでるようです。


No.1712

Re:ポインタを使うと速くなる?
投稿者---snow(2002/06/10 09:57:43)


ども、snowです。
気になることがあるので蛇足ですがちょっと説明を。
上記にあった過去ログの中でも紹介されている”C言語ポインタ 完全制覇”
という本に、このポインタの速度についての話が載っています。

要約すると、
ポインタを使ったほうが早かったのはあくまで昔の話であり、
現在の通常のコンパイラでは対して差はない。コンパイラによっては
配列、ポインタ共に同じコードを出力することもある。
と記述されています。

そんなわけで、無理にポインタを使う必要はないかと。
また、この本ですが、初心者にはお勧めできませんが、なぁなぁで
ポインタを使ってる人は読んで見ると良いかも知れません。
意外と面白いことが載っています。

No.1713

Re:ポインタを使うと速くなる?
投稿者---shu(2002/06/10 11:37:48)



関数の引数なんかに構造体など比較的大きな値を使う時は、
ポインタを使ったほうが早いと思うのですが?



No.1714

Re:ポインタを使うと速くなる?
投稿者---shelly(2002/06/10 15:22:39)


元ネタは、
>それは「配列よりポインタを使ったほうが処理が速くなる」ということです。
>どのような場合にこのようなことがいえるのでしょうか?
ということだったと思います。

よく聞くのは、
for (i = 0; i < n; i++) {
    array[i] = ...;
}
と書くより、
for (p = &array[0]; p < &array[n]; p++) {
    *p = ...;
}
のような書き方の方が高速だ、という神話です。

実際にはコンパイラが賢くなっているので、もう10数年前くらいからはこの神話
は崩れているんじゃないでしょうか?

>関数の引数なんかに構造体など比較的大きな値を使う時は、
>ポインタを使ったほうが早いと思うのですが?

これはもちろんそのとおりだと思いますが、配列とポインタの
速度比較には関係ないと思います。