K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[2251] ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Hiroyuki Naito
2021/06/12 17:25:08

本文p75の「*pがループの中に何度出現しても掛け算と足し算はループの終わりの1回だけで済む」で、引っかかっています。 array[i]は、ループ中に出現するたびごとに「array + (i * 1要素のサイズ)」に相当するアドレス計算を行うというのは理解できますが、*pでも「p + (p++ごとに1要素のサイズ)」に相当するアドレス計算を行っているように思えます。「掛け算と足し算はループの終わりの1回だけ」という意味をご教示いただけるとありがたいです。 よろしくお願いいたします。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2252] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:(ぱ)こと管理人
2021/06/12 20:36:48

はじめまして。読んでいただきありがとうございます。 >array[i]は、ループ中に出現するたびごとに「array + (i * 1要素のサイズ)」に相当する >アドレス計算を行うというのは理解できますが、*pでも「p + (p++ごとに1要素のサイズ)」 >に相当するアドレス計算を行っているように思えます。「掛け算と足し算はループの終わり >の1回だけ」という意味をご教示いただけるとありがたいです。 「ループの終わりの1回だけ」というのは、たとえばループが100回回ったとして、 各繰り返しの最後に1回、という意味です。つまり、100回ループが回れば、 「p + 1要素のサイズ」という計算は100回は行います。 ただし、ループの中に、array[i]が5回出てくるとすれば、最適化をろくにやらない コンパイラなら、100回ループが回った時に「array + (i * 1要素のサイズ)」という計算は 500回行われます。それが100回で済むなら、*pの方が高速になるでしょう。 コメントで「array[i]は、何度も登場する」と書いてあるのはそういう意図です。 これで回答になっていますでしょうか?
[この投稿を含むスレッドを表示] [この投稿を削除]
[2253] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Hiroyuki Naito
2021/06/13 23:52:20

ご回答ありがとうございました。 ポインタ演算*(p + i)が、array[i]の計算の「最適化の手を抜くために付けられた機能」という意味が理解できました。 今後はarray[i]の記法を活用していきたいと思います。 >はじめまして。読んでいただきありがとうございます。 > >>array[i]は、ループ中に出現するたびごとに「array + (i * 1要素のサイズ)」に相当する >>アドレス計算を行うというのは理解できますが、*pでも「p + (p++ごとに1要素のサイズ)」 >>に相当するアドレス計算を行っているように思えます。「掛け算と足し算はループの終わり >>の1回だけ」という意味をご教示いただけるとありがたいです。 > >「ループの終わりの1回だけ」というのは、たとえばループが100回回ったとして、 >各繰り返しの最後に1回、という意味です。つまり、100回ループが回れば、 >「p + 1要素のサイズ」という計算は100回は行います。 >ただし、ループの中に、array[i]が5回出てくるとすれば、最適化をろくにやらない >コンパイラなら、100回ループが回った時に「array + (i * 1要素のサイズ)」という計算は >500回行われます。それが100回で済むなら、*pの方が高速になるでしょう。 >コメントで「array[i]は、何度も登場する」と書いてあるのはそういう意図です。 > >これで回答になっていますでしょうか? > >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2336] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Okamoto
2023/07/06 21:57:11

学生時代に逃げ出したポインタへ改めて向き合おうと思い、ポインタ完全制覇を読ませていただいております。 読み進める中で、こちらの投稿と同じところでつまずいてしまったので質問させていただきます。 *pという記法の場合、p+1要素のサイズという足し算が各繰り返しごとに行われていると解釈したのですが、掛け算はどの段階で行われているのでしょうか。 ご回答よろしくお願いします。 >はじめまして。読んでいただきありがとうございます。 > >>array[i]は、ループ中に出現するたびごとに「array + (i * 1要素のサイズ)」に相当する >>アドレス計算を行うというのは理解できますが、*pでも「p + (p++ごとに1要素のサイズ)」 >>に相当するアドレス計算を行っているように思えます。「掛け算と足し算はループの終わり >>の1回だけ」という意味をご教示いただけるとありがたいです。 > >「ループの終わりの1回だけ」というのは、たとえばループが100回回ったとして、 >各繰り返しの最後に1回、という意味です。つまり、100回ループが回れば、 >「p + 1要素のサイズ」という計算は100回は行います。 >ただし、ループの中に、array[i]が5回出てくるとすれば、最適化をろくにやらない >コンパイラなら、100回ループが回った時に「array + (i * 1要素のサイズ)」という計算は >500回行われます。それが100回で済むなら、*pの方が高速になるでしょう。 >コメントで「array[i]は、何度も登場する」と書いてあるのはそういう意図です。 > >これで回答になっていますでしょうか? > >
[この投稿を含むスレッドを表示] [この投稿を削除]
[2337] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:(ぱ)こと管理人
2023/07/08 16:06:07

はじめまして。 >学生時代に逃げ出したポインタへ改めて向き合おうと思い、ポインタ完全制覇を読ませていただいております。 >読み進める中で、こちらの投稿と同じところでつまずいてしまったので質問させていただきます。 >*pという記法の場合、p+1要素のサイズという足し算が各繰り返しごとに行われていると解釈したのですが、 >掛け算はどの段階で行われているのでしょうか。 まず、array[i]の記法の場合、array[i]を使うごとに「array + (i * 1要素のサイズ)」に 相当するアドレス計算を行う必要があります。 *pの記法の場合、ループの1回のくり返しの中ではpは動かないので、上記のような アドレス計算を何度も行う必要はない(だから最適化をしないコンパイラなら速くなる)、 というのが該当の記述の趣旨だったのですが、 p.75の該当の記述は以下のようになっていて、 「*pがループの中に何度出現しても、掛け算と足し算はループの終わりの 1回だけで済みます。」 *pの記法の場合、各ループの末で行うのはp++であって、毎回ひとつずつ進めるのであれば、 確かに掛け算は不要です。 ・array[i]記法では、ループ内にarray[i]が何度も出てきたら、その数だけ掛け算と足し算を行う。 ・*p記法では、*pが何度出てきても、そういう計算は1回でよい。 ということを言いたかったのですが、「そういう計算」の中身が違いますね。 本の記述が誤りだと思います。 22年以上前の初版本からこの記述はあるのですが、この誤りは見つかっていませんでした。 ご指摘ありがとうございました。正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]
[2338] Re:ポインタ完全制覇(第2版) p75 *pのループ中の計算
投稿者:Okamoto
2023/07/08 17:26:51

ご返信いただきまして、ありがとうございます。すっきり理解することができました。 ざっと読んでは細かく読むというのを繰り返している状況です。 また疑問点があった際には質問させていただければと思います。 今後ともよろしくお願いいたします。 >はじめまして。 > >>学生時代に逃げ出したポインタへ改めて向き合おうと思い、ポインタ完全制覇を読ませていただいております。 >>読み進める中で、こちらの投稿と同じところでつまずいてしまったので質問させていただきます。 >>*pという記法の場合、p+1要素のサイズという足し算が各繰り返しごとに行われていると解釈したのですが、 >>掛け算はどの段階で行われているのでしょうか。 > >まず、array[i]の記法の場合、array[i]を使うごとに「array + (i * 1要素のサイズ)」に >相当するアドレス計算を行う必要があります。 >*pの記法の場合、ループの1回のくり返しの中ではpは動かないので、上記のような >アドレス計算を何度も行う必要はない(だから最適化をしないコンパイラなら速くなる)、 >というのが該当の記述の趣旨だったのですが、 > >p.75の該当の記述は以下のようになっていて、 >「*pがループの中に何度出現しても、掛け算と足し算はループの終わりの >1回だけで済みます。」 >*pの記法の場合、各ループの末で行うのはp++であって、毎回ひとつずつ進めるのであれば、 >確かに掛け算は不要です。 > >・array[i]記法では、ループ内にarray[i]が何度も出てきたら、その数だけ掛け算と足し算を行う。 >・*p記法では、*pが何度出てきても、そういう計算は1回でよい。 >ということを言いたかったのですが、「そういう計算」の中身が違いますね。 >本の記述が誤りだと思います。 > >22年以上前の初版本からこの記述はあるのですが、この誤りは見つかっていませんでした。 >ご指摘ありがとうございました。正誤表に入れさせていただきます。
[この投稿を含むスレッドを表示] [この投稿を削除]