autoとregisterはCの変数のストレージ指定子です。
autoは歴史的に関数/ブロック内の自動変数を示します。デフォルトですべてのローカル変数はautoですので、通常は明示的に書く必要はありません。
registerはコンパイラにプロセッサのレジスタに変数を格納するように要求し、アクセスを速くします。しかし、現代のコンパイラは自動的にストレージを最適化し、この要求には無視または最小限の反応を示します。
また、register型の変数はアドレスを持つことができません(&varは禁止されています)。
例:
register int counter = 0; auto float sum = 0.0f;
register変数のポインタを宣言できますか?例えば:
register int x = 5; int *p = &x;
いいえ、register変数のアドレスを取得することはできません — これはコンパイルエラーになります。register指定子は変数のアドレスを取得する操作を禁止します。
物語
古いプロジェクトで、開発者はループ変数にregisterを使用し、そのアドレスを関数に渡そうとしました:foo(&i);。コードはコンパイルされず、register指定子を取り除く必要がありました。エラーはビルド中に発見され、リファクタリングが長引きました。
物語
チームは大きなサイズの変数(例えば、構造体)にregisterを使用しようとしました。コンパイラはこの要求を無視し、メモリに変数を格納しました。その結果、期待したパフォーマンス向上が得られず、開発者は遅延の理由を長い間探し続けました。
物語
コードでローカル変数にautoを広く使用し、他の言語に基づいて良いスタイルだと考えました。これはコードを煩雑にし、動作に影響を与えず、読みやすさを複雑にし、同僚から疑問を引き起こしました。