記号の早見表
C++ の第 2〜6 章と、第 7〜9 章で MISO のコードを読みながら、記号やキーワードの意味を確かめるための表です。 通読する必要はありません。各行の「詳しい説明」から本文の章へ戻れます。
目次
読み方の基本:宣言か式か
C++ では、同じ記号が宣言(新しい名前を作る文)と式(すでにある名前を使う計算)で別の意味になります。 記号に迷ったら、まずその行が名前を作っているのか、使っているのかを確かめます。
double a = 1.0;
double *p = &a; // * in a declaration: p is a "pointer to double". & in an expression: address of a
*p = 2.0; // * in an expression: write 2.0 to what p points to (a)
double &r = a; // & in a declaration: r is an alias (reference) of a
以下の表では、a・b を double の変数、p を double * 型のポインタ、T をテンプレート引数の型として読みます。
* と & と &&
見かけた形 |
宣言か式か |
意味 |
詳しい説明 |
|---|---|---|---|
|
宣言 |
|
|
|
式 |
|
|
|
式 |
掛け算です |
|
|
宣言 |
|
|
|
宣言(引数) |
参照渡しです。関数の中で |
|
|
宣言(引数) |
読むだけの参照渡しです。コピーせず、変更もしません |
|
|
式 |
|
|
|
式 |
クラス |
|
|
式 |
論理積(かつ)です。Fortran の |
|
|
宣言(引数) |
右辺値参照です。ムーブ(中身の移し替え)を受け取るときに使います |
|
|
宣言 |
|
|
|
宣言 |
|
|
|
宣言(メンバ) |
|
|
|
宣言(引数) |
ポインタを指すポインタです。 |
MISO のソースは double *p のように * と & を名前の側に付けて書きます(.clang-format の設定)。
double* p と double *p は同じ意味です。
名前とメンバを指す記号(:: . ->)
見かけた形 |
意味 |
詳しい説明 |
|---|---|---|
|
名前空間の中の名前です。 |
|
|
名前空間 |
|
|
先頭の |
|
|
クラスに属する名前( |
|
|
テンプレート引数 |
|
|
実体(または参照)のメンバを使います |
|
|
ポインタ |
|
|
メンバ関数の中で、自分自身を指すポインタ |
括弧(<> [] () {})
見かけた形 |
意味 |
詳しい説明 |
|---|---|---|
|
標準ライブラリなど、決まった場所にあるヘッダを読み込みます |
|
|
自分のファイルからの相対位置でヘッダを探して読み込みます |
|
|
比較、ビットのずらし、出力です |
|
|
テンプレート引数です。山括弧まで含めて 1 つの型の名前になります |
|
|
後から決める型の名前を宣言します |
|
|
完全な特殊化です(すべてのテンプレート引数を決めた定義) |
|
|
変数テンプレート・関数テンプレートに型を指定して使います |
|
|
|
|
|
CUDA のカーネルの起動です。C++ の記号ではありません |
|
|
配列や |
|
|
宣言の |
|
|
配列の確保と解放です |
|
|
|
|
|
ラムダ式(名前のない関数)の始まりです。 |
|
|
関数の呼び出しです |
|
|
宣言の |
|
|
|
|
|
|
|
|
宣言の後の |
|
|
計算の順序を決める括弧です |
|
|
処理のまとまり(ブロック)です。中で宣言した変数は |
|
|
クラスの本体です。 |
|
|
波括弧による初期化です |
|
|
型の値を初期値なしで作る式です。タグ型を関数に渡すときに使います |
|
|
コンストラクタの初期化子リストです( |
<...> と (...) の区別が大切です。Array3D<float> a(4, 4, 4); の float は型の指定、4, 4, 4 はコンストラクタへ渡す値です。
その他の演算子
見かけた形 |
意味 |
詳しい説明 |
|---|---|---|
|
代入です。比較は |
|
|
等しい・等しくない(Fortran の |
|
|
論理和(または)、否定(Fortran の |
|
|
整数の割り算の余り(Fortran の |
|
|
|
|
|
|
|
|
|
|
|
デストラクタ(後片付けの関数)の名前です |
|
|
関数の本体の代わりに書く指定です。コンパイラに用意させる・使えなくする |
|
|
クラスの宣言での |
プリプロセッサの記号(#)
# で始まる行は、コンパイルの前にプリプロセッサが処理します。C++ の文法とは別の、テキストの置き換えです。
見かけた形 |
意味 |
詳しい説明 |
|---|---|---|
|
ファイルの中身をその場所に読み込みます |
|
|
同じヘッダを 2 回読み込まないようにします |
|
|
|
|
|
マクロが定義されているかで、コンパイルする部分を選びます。Fortran の |
|
|
CUDA のコンパイラ(nvcc)でビルドしているときだけ有効な部分です |
|
|
マクロの定義を取り消します |
|
行末の |
マクロの定義を次の行へ続けます |
|
マクロの中の |
前後をつないで 1 つの名前にします( |
|
マクロの中の |
引数を文字列にします( |
キーワード
宣言の中の位置によって意味が変わるものを中心にまとめます。
キーワード |
見かけた形と意味 |
詳しい説明 |
|---|---|---|
|
|
|
|
||
|
||
|
||
|
||
|
|
|
|
|
|
|
|
|
|
||
|
||
|
|
|
|
||
|
||
|
|
|
|
||
|
ヘッダに定義を置く通常の関数や変数に付けます。速くする指定ではありません |
|
|
クラスの中では、実体によらずクラスに属するメンバです |
|
|
コンストラクタによる暗黙の型変換を禁止します |
|
|
関数が例外を外へ出さないことを表します |
|
|
実行時に派生クラスの関数を選ぶ仮想関数です。MISO では使っていません |
|
|
式を実行せずに、その型を求めます |
|
|
条件がコンパイル時に決まる分岐です。選ばれない側は組み込まれません |
|
|
条件が偽ならコンパイルエラーにします |
|
|
どこも指していないポインタです |
|
|
メンバ関数の中で、自分自身を指すポインタです。ラムダの中で使うと GPU で問題になります |
|
|
クラスの宣言です。 |
MISO と CUDA の記号
C++ のキーワードではなく、MISO や CUDA が用意する名前です。
見かけた形 |
意味 |
詳しい説明 |
|---|---|---|
|
demo で |
|
|
計算とメモリの場所を表すタグ型です( |
|
|
ラムダ式の始まりを表すマクロです。CPU のビルドでは |
|
|
関数を CPU・GPU のどちらから呼べるかの指定です。CPU だけのビルドでは空になります( |
|
|
GPU で動くカーネル関数の指定です |
|
|
MPI のライブラリの型と関数です |
宣言を読むときの確認順序
長い宣言は、次の順に分けて読みます。
名前を見つけます。 変数・関数・型のどれを宣言しているかを確かめます。
型を読みます。
<...>まで含めて 1 つの型です。template <...>が前にあれば、山括弧の中の名前は後から決まる型です。値・参照・ポインタを区別します。 名前に
&や*が付いているかを見ます。constの対象を確かめます。 値、指す先、ポインタ自身、メンバ関数のどれかを区別します。作り方と寿命を確かめます。 初期値、引数、戻り値がどの実体を使い、いつまで使えるかを追います。
例として、miso/include/miso/mhd_integrator.hpp の宣言を分けて読みます。
template <typename Real, typename Source>
__host__ __device__ inline Real source_vx(const Source &src,
const FieldsView<const Real> &qq,
int i, int j, int k);
部分 |
読み方 |
|---|---|
|
|
|
CPU からも GPU からも呼べる関数です |
|
ヘッダに置く関数です |
|
名前は |
|
ソース項の実体を、読むだけの参照で受け取ります |
|
要素を読むだけの View( |
|
格子点の添字を値で受け取ります |