読者です 読者をやめる 読者になる 読者になる

MyEnigma

とあるエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

あまり馴染みのないC++のキーワードを調べてみた

独習C++独習C++
ハーバート・シルト,神林 靖,トップスタジオ

翔泳社
売り上げランキング : 158808

Amazonで詳しく見る by AZlink

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
スコット・メイヤーズ,小林 健一郎

ピアソン・エデュケーション
売り上げランキング : 246250

Amazonで詳しく見る by AZlink

かれこれ7,8年C++を使っていますが、

久しぶりの冒頭の本を読みなおした所、

知らないC++のキーワードが大量に出てきたので、

焦って調べてみました(笑)。

asm

これはC++ソースコードの中で

アセンブラ言語のコードを実行するためのキーワードです。


CやC++は既に高速ですが、より一層高速にしたい部分を

asmキーワードと共にアセンブラで書きなおすことができます。

wchar_t

ワイドバイトの文字用のキーワードです。

一般的な半角英数字は1byteのcharで表すことができますが、

日本語などをサポートしたUnicodeは、一文字を2バイトで表すため、

このwchar_tを使うことになります。

しかし、使用するコンパイラによってはwchar_tは4byteである可能性もあるため、

注意が必要です。

typeid

typeidはあるオブジェクトの型を確認することができるキーワードです。

オブジェクト指向でコードを書くと、プログラム実行時までそのオブジェクトの型がわからない場合がありますが、

typeidを使うと、そのオブジェクトの型のidを取得して、

その情報を使って条件分岐などを実施することができます。


ちなみにこのtypeidはC++11の仕様なので、

C++11にコンパイラが対応していないと使用できないようです。

tyepename

これはテンプレートを使用した時に、

明示的に型名を指定する時に使用するキーワードです。


テンプレートを使っている時に、下記の参考文献のように、

そのコードが変数名なのか、それとも型の名前なのかを

コンパイラが判断できるように、多くのコンパイラでは

このtypenameを使わないとコンパイラエラーにするようにしているようです。

auto

これは、コンパイル時に自動的に型を決定してくれるキーワードです。


C++は静的型付け言語なので、変数を使う時には型を指定する必要がありますが、

autoはコンパイル時にコンパイラが適切に型を指定してくれるようになります。


ネットで調べるとSTLイテレータを使う時に、

長い型名を書かなくて良くなるっていう部分が便利だと言っている人が多いようです。


こちらもC++11の仕様です。

explicit

このキーワードは暗黙的な型変換を防ぐためのキーワードです。


C++では引数を一つしかもたないクラスのコンストラクタでは、

下記の式が同じものになってしまいます。

hoge obj(10);

hoge obj=10;//暗黙的


この機能はうまく使えば便利なのですが、

間違えて代入したのにコンストラクタが呼ばれることは

バグの原因となります。

そこでコンストラクタにexplicitをつけることにより、

下の呼出し方を防ぐことができます。(コンパイルエラーになる)


この内容は、Googleのスタイルガイドや

C++の有名な本であるEffective C++にも書いてあります。

Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)Effective C++ 原著第3版 (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
スコット・メイヤーズ,小林 健一郎

ピアソン・エデュケーション
売り上げランキング : 246250

Amazonで詳しく見る by AZlink


register

このキーワードは指定した変数へのアクセスを高速にするためのキーワードです。


registerが付いた変数は、コンパイラによって高速にアクセスできる所

(大抵はCPU無いのレジスタ)に置かれ、高速にアクセスすることができます。

かつてのプログラムでは、forループのインデックス変数などをこのregister指定することで

プログラムを高速化していたようです。


しかし、最近のコンパイラ

register指定しなくても、

自動的にそのような最適化を実施することが多いため、

このキーワードはあまり使われることはなく、

将来的には削除される可能性があるようです。

mutable

mutableはconstメンバ関数内において、

値を変更することができるメンバ変数を作る場合に

使用するキーワードです。


一般的にconstメンバ関数は、

メンバ変数を変更しないというものですが、

外からみるとconstメンバ関数にして、使いやすくし、

中ではちょっとしたmutable変数を使って、

関数の高速化などを実施することが多いようです。


しかし、const関数を、

constでは無くしてしまうキーワードですので、

多用すると問題が発生しそうです。

volatile

volatileは、コンパイラによる最適化を抑制するキーワードです。


registerキーワードの項で説明したように、

最近のコンパイラは自動的に変数を

頻繁に使用するものはレジスタに、

あまり利用しないものはメモリに格納しますが、

volatileキーワードをつけると、その変数はメモリに格納するようになります。


これはマルチスレッドのプログラムにおいては、問題が発生することがあります。

あるコード上では変更されないように見える変数でも、

マルチスレッドで別のスレッドが変更するようなプログラムがある時に、

自動で最適化をされてしまうと、意図しない振る舞いをする実行コードが生成されてしまうのです。