2010-01-28

C++0x本:御免

C++0xには、説明を省いてもいいのではないかと思う機能も、いくつか存在する。

たとえば、registerやinlineは、もはやまともに使われてはいない。モダンなコンパイラは、ことごとく無視する。今や、この手の最適化に関しては、コンパイラの方が人間より賢いのである。

exportは、まともに実装しているコンパイラがない。

asmは、完全に無視されている。インラインアセンブリをサポートしているコンパイラでも、結局、独自の文法を使っているのである。

しかし、これらの理想主義を広げていくと、危険である。

long longはC99とかいう時代遅れの言語から取った機能だ。使うべきではないし、そもそも規格に入れるべきではなかったので解説しない。

volatileは何の役にもたたないので解説しない。

これらは、ある意味正しいのだが、long longやvolatileは、実際に型として認識される。これを解説しないのは問題がある。

extern "C"はどうか。私は、これも気にいっていない。単にC言語との互換性以外に、別言語と会話する場合に必要だという意見もあるかもしれない。しかし、現実はさらにややこしい。レジスタをどう使うか。スタックに引数をどのように積むか、などといった呼び出し規約は、規格外である。そもそも、レジスタやスタックなど、規格では規定されていないのである。純粋にextern "C"だけ説明しても、何の役にもたたない。

ページ数が足りないから割愛するならともかく、気に入らないから割愛、役に立たないから割愛というのは果たしてどうだろうか。しかし、具体的な環境がなければ意味をなさないこれらの機能を、ただ言語上の定義から解説しても、無意味である。

ここに挙げた以外にも、規格の上では定義されているが、実際何の役にも立たない機能は多数存在する。その機能の多くは、相当の年季の入ったC++プログラマも知らないのである。たとえば、テンプレートのデフォルト引数がマージされるような機能は、誰も知らないだろうし、知っていても、使いたいとは思わないだろう。関数ポインタの宣言時に、デフォルト引数を指定できるという機能は、C++0xで禁止された。

6 comments:

  1. > ポインタの宣言時に、デフォルト引数を指定できるという機能

    これって何? 概略でいいんで、教えてくれませんか。

    ReplyDelete
  2. 今調べたら、C++0xではなく、C++03で、すでに禁止されていました。

    こういうやつです

    void f(int x = 0)
    {

    }

    int main()
    {
    void (*fp)(int = 1) = &f ;

    fp() ; // f(1)と同じ。デフォルト引数を変える事ができる。
    }

    C++98では、これができたのです。

    ReplyDelete
  3. 知らないはずだよ。

    この機能なら、C++98の時点で既にありません。

    ReplyDelete
  4. > volatileは何の役にもたたないので解説しない。

    え? そうなのですか?
    UNIX上のC言語プログラムでは、シグナルハンドラと、そうでないコードの間で、同一の変数をアクセスする場合に必要となることがあります。
    組み込み用途のC言語プログラムでも、割り込みハンドラと、そうでないコードの間で、同一の変数をアクセスする場合に必要となることがあります。
    C++で、volatile を使わずにそういうプログラムを書く場合には、どうするのが正しいのでしょうか?

    ReplyDelete
  5. volatileの定義は、シグナルハンドラの中からでも使えることと、
    積極的に最適化をしないということです。

    前者はともかく、後者は、ただ積極的な最適化をしないというだけで、
    じゃあ、具体的にどんな最適化をしないのか、ということは決められていないので、
    到底、まともに使うことは出来ないのです。
    そういうことがしたかったら、環境依存の拡張機能が使われるでしょうし。

    結局、volatileというのは、Cから持ってきた機能なんですよね。
    C++としては、シグナルハンドラというのは、あまりそぐわない、と個人的には思うのです。

    ReplyDelete
  6. > 結局、volatileというのは、Cから持ってきた機能なんですよね。

    もちろんそうですが、シグナルハンドラや割り込みハンドラを C++ で
    書くのであれば、知っている必要のある機能なんだと思います。

    > C++としては、シグナルハンドラというのは、あまりそぐわない、と個人的に
    > は思うのです。

    まあ、そういうニッチはいまだに Cの方が向いているのかもしれませんね。

    いずれにせよマイナーな分野であるのは間違いないので、敢えて解説しない
    ということに問題はないと思います。

    ただ、「何の役にも立たない」という表現は引っかかりました。
    そういうマイナーな分野に C++ を使っている人も、全くいないわけではない
    と思うので。

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.