register intって何?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
saimon

register intって何?

#1

投稿記事 by saimon » 18年前

for文のループで処理を早くする為に

register int

を使うという記述があるのですが、register intについての説明が無く、またウェブで探してみたのですが、よい説明書きが見つからず、困っています。
register intとは何なのでしょうか?また、register intを使ってループを書くと処理が早くなるのでしょうか?

組木紙織

Re:register intって何?

#2

投稿記事 by 組木紙織 » 18年前

registerは変数へのアクセスを最大限速くしなさいという意味の予約語です。

基本的にforループでは特定の変数へのアクセスが多くなるので、その変数にアクセスする時間が
短くなればforループ全体の時間も短くなるということになります。

registerを使っても使わない場合と同じ速度の場合もありますし、大量にregisterを使うと大部分は普通の変数と速度は変わりなくなるので、一つの関数内で、registerを使うのは1個か2個ぐらいまでにとどめておくのが
よいかと思います。
特にint かchar の変数を一つの関数内で一つのみregisterにすると一番有効に働きます。

最近のパソコンでは、十分に速いので、registerを使っても速度は感覚的にはほとんど変わらないと思います。
組み込み系などの特殊な環境では知りませんが。

keichan

Re:register intって何?

#3

投稿記事 by keichan » 18年前

>組み込み系などの特殊な環境では知りませんが。
どうなんでしょうね?
本当に処理を稼ぎたいプリミティブな箇所では register 宣言子を用いるよりは
アセンブラでやっちゃいそうな感じがするので、使い所がわかりません。
#古き良き時代の名残?

keichan

Re:register intって何?

#4

投稿記事 by keichan » 18年前

うわ。恥ずかしいorz

×プリミティブ

○クリティカル

YuO

Re:register intって何?

#5

投稿記事 by YuO » 18年前

registerは,できるだけレジスタに割り当ててね,というプログラマからの要望です。
あくまで要望なので,実際にレジスタに割り当てるかどうかはコンパイラ次第になります。
Visual C++のように「無視する」という処理系も存在します。

ただし,registerつけて宣言するとポインタが使えないなどの制限が出てきます。
これは実際にレジスタに割り当てられたかどうかに関わらず,です。


ちなみに,同じく「お願い」に過ぎない物に,inlineがあります。

組木紙織

Re:register intって何?

#6

投稿記事 by 組木紙織 » 18年前

>ただし,registerつけて宣言するとポインタが使えないなどの制限が出てきます。

これは確かCでの話しだったと思います。C++ではポインタが利用できたはずです。

何処で仕入れた情報か忘れたので情報元は示せませんが、
私の環境(Borland C++ 5.5.1 for Win32)
では上記のようになりました。
確認したコードは以下のようなものです。
#include<stdio.h>
int main()
{
  register int a;
  int * b = &a;
 	printf("%p",b);
 return 0;
}

YuO

Re:register intって何?

#7

投稿記事 by YuO » 18年前

確かにC++においてはregisterはコンパイラにヒントを与える以外,autoと同じですね (IS C++:1998 7.1.1 / para.3)。
ただ,C言語の話 (IS C:1999 6.5.3.2 / para.1) をしているので,それは関係ないかと。
# inlineはCの範囲内 (IS C:1999 6.7.4) なので記述しています。


IS C++:1998 = ISO/IEC 14882:1998
IS C:1999 = ISO/IEC 9899:1999

組木紙織

Re:register intって何?

#8

投稿記事 by 組木紙織 » 18年前

># inlineはCの範囲内 (IS C:1999 6.7.4) なので記述しています

すみません。
私が持っているCの参考書にはinlineの記述が載っていないので、inlineはC++の範囲だとずっと思っており
先程のような記述をしてしまいました。



規格書欲しいな。

Justy

Re:register intって何?

#9

投稿記事 by Justy » 18年前

組み込み系などの特殊な環境では知りませんが
 昔、某社のとあるCコンパイラは最適化をかけてコンパイルしても、
関数の引数の値がレジスタ経由でわたってきているのにそれをスタックに入れた後、
(確実にレジスタ上にあるにも関わらず)わざわざスタックから値を取り出してから
使うコードを吐くタココンパイラでした。

 で試しに引数に registerを指定してみたらスタックから取り出さず、レジスタの値を
そのまま使うようになりました。

 まぁ、影響はほとんどないので既存のコードはそのままにしましたが・・・。



規格書欲しいな
 あ、そういえば例の C++の JISの規格書が、前は画像オンリーで検索できませんでしたが、
いつの間にか2冊に分かれてテキストデータが入って検索できるようになってますよ。

 ただ、どうも OCRの性能が悪いらしく、アルファベットのヒット率はかなり低いです。
http://www.jisc.go.jp/app/pager?id=110315

saimon

無題

#10

投稿記事 by saimon » 18年前

なるほど、なんとなく理解出来ました。
今回サンプルの中にポインタを使ったループが書かれていて

register int *i, *j, *s, *t;

として利用してありました。
処理を早くするためポインタを使えと。
ポインタを使うと早くなるんでしょうか?

上記回答から拝見すると4つも利用してしまっては意味がなくなってしまうのでしょうか?
あまり多いと、普段の変数と同じ場所に用意されてしまうのでしょうか?
「レジスタ」というものを初めて聞きましたけど、普段用意する場所より早くアクセスできる場所の事なのでしょうか?

また、友達も同じ疑問を抱いているのですが、参考にさせられるサイトとかありませんでしょうか?

質問だらけで申し訳ないです・・。よろしくお願いします。

YuO

Re:無題

#11

投稿記事 by YuO » 18年前

> 処理を早くするためポインタを使えと。
> ポインタを使うと早くなるんでしょうか?

ポインタを使うべき場所で使えば早くなりますが,直接アクセスで十分なところに使えば遅くなります。


> 上記回答から拝見すると4つも利用してしまっては意味がなくなってしまうのでしょうか?
> あまり多いと、普段の変数と同じ場所に用意されてしまうのでしょうか?

えーっと,一般的なPCで使われているX86アーキテクチャだと,
EAX, EBX, ECX, EDX, ESI, EDI
の6個あたり,頑張ってESPくらいが限界になります。
後でレジスタについて説明を書きますが,じゃあ7個使えるかというとそうではなく,現実的にはESI, EDI程度が使えれば良い方です。
# X64だとR8~R15が増えるんだったかな……。あと,面倒なのでMMX以降の特殊用途レジスタやセグメントセレクタ等も省略。

なので,ループ変数に気休め程度に指定する,というのが通常かと。
# or 指定しない。
どちらにしても,ほとんどはauto扱い (つまりは普通の変数と同じ扱い) になると思います。
また,registerよりも変数割付に適した変数をコンパイラが発見した場合,そちらをレジスタに割り当てることもあります。


組み込み系などで細かく制御ができる場合はちゃんと指定するのでしょうが……。


> 「レジスタ」というものを初めて聞きましたけど、普段用意する場所より早くアクセスできる場所の事なのでしょうか?

レジスタとは,CPUが唯一直接アクセス可能な超高速メモリ群です。
# というあたりがコンピュータ工学的な説明でしょうか。


基本的に,CPUはレジスタ間でしか計算を実行できません。
# X86系統だとレジスタとメモリの間での演算やメモリと即値の演算を許していたりはしますが……。

そのため,非常に高速にアクセスができるようになっています。
もちろん,1次キャッシュよりも何十倍も速くアクセス可能です。
ただし,それだけに量が限られます。
多くてもKBの単位ではないでしょうか。
# RISCならたくさんあるやつがあると思うので……。

で,X86のように数の特に少ないCPUでは,頑張って使い回すことになります。
このあたりはアセンブリ言語を使うといやと言うほど体感させられます。


> 規格書欲しいな

http://webstore.ansi.org/ansidocstore/default.aspで,INCITS/ISO/IEC 9899:1999とINCITS/ISO/IEC 14882:2003がともに$30で売っていますよ。
英語になりますが,JISだと片方だけでも万に届くので,それを考えれば格安です。
# 私が買ったときは$26と$18だったはず……。元値で変動がある上に為替相場が関連するので,相場を読んだ方が安く買えます。

Hermit

Re:無題

#12

投稿記事 by Hermit » 18年前

># inlineはCの範囲内 (IS C:1999 6.7.4) なので記述しています。
たしか、ANSI C89 の範囲まではこれは使えないので、
書いてない参考書も多いのでは。
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
でも C では使えないみたいだし。

gcc くらいだったら、-ansi しても Ver1 系でも使えていたけど。

閉鎖

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