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

C/C++用語集

雑記

 これまでにググったC/C++の用語をまとめておく。
ふわっと意味が分かっている単語もそれが大量に羅列されるとストレスがたまるので、そこそこ簡単なものも節操なく書く。c++の絵本読めばわかるレベル。

 構造体やクラス内で定義された関数や変数を、その構造体もしくはクラスのメンバと呼ぶ。

 主に名前空間内の関数の呼び出しに使用。using namespace ~で省略可。
もしくはクラス内のstaticかつpublicな関数ならば(そう明示して定義すれば)、そのクラスのオブジェクト(class A; みたいなやつ)を定義しなくても呼び出すことが可能。

  • ヒープとスタック

 これはC/C++関係ない。プログラム内でデータをメモリに保管する際、適当な領域を確保する必要がある。
このときプログラム内で後々領域を移動できるよう、動的に確保した領域をヒープ、一度指定したらもう動かせない領域をスタックと呼んでいるらしい。
ヒープ領域ならばメモリのどの場所にあるかを明示することができる。この住所みたいなもんを、そのままアドレスと呼ぶ。
ヒープとスタック | 学校では教えてくれないこと | [技術コラム集]組込みの門 | ユークエスト株式会社
 C/C+で悪名高いポインタは、ポインタの名前のみをスタック領域に保存し、内部のデータをヒープ領域に保存している。Cでファイルの入出力のときに定義するポインタも、ファイルの中身をIO処理するのでわざわざメモリに固定する必要がないという経緯から定義されている?

構造体やクラス内のメンバがスタック領域にあるときの呼び出し方。構造体もしくはクラスの宣言に依存。
A.hogehogeみたいなやつ。

構造体やクラス内のメンバがヒープ領域にあるときの呼び出し方。構造体もしくはクラスの宣言に依存。
A->hogehogeみたいなやつ。


  • 値渡し、ポインタ渡し、参照渡し

 関数の定義の際の変数の設定方法。値渡しはただ単に設定した変数のコピーがそのまま関数に入力される。関数側でその変数の値が変わったところで、入力側に影響しない。

ポインタ渡しと参照渡しの定義は若干混乱が見られる。C言語だと両方同じものを指すが、C++だと少し意味が異なる。

 関数の宣言に*Aとして記述されていればポインタ渡し。入力側が指定したアドレスがコピーされて関数側に入力される。アドレスの差す領域自体は不変なので、関数内で値が変わると入力側の値も変更される。
面白いことに、スタック領域に定義した変数も、関数の呼び出しの際に&Aと書くことでスタック領域のアドレスが関数内にコピーされ、領域内の値を変更できる。

 関数の宣言に&Aとして記述されていれば参照渡し。スタックだろうがヒープだろうが、どこに保管したデータもアドレス自体は必ず持っている。それを明示したのがポインタだが、スタックだってアドレスがなければコンピュータは認識できない。参照渡しとは、わざわざポインタを明示しなくても、ポインタ渡しと同じことが出来るようになる渡し方であろう、と、考えられる。ポインタ渡しにしてしまうと、その関数内では全ての変数をポインタとして書かないといけないので、アロー演算子が必要になったり面倒くさい。参照渡しにしておけば、通常の変数として特にストレスなく書けるのでなんとなく楽。

 なお、値渡しと参照渡しでは比較にならないほど参照渡しの方が速いらしい。値渡しをC++ユーザが使用するメリットはないので、手当り次第&をつけて定義すれば多分よさげ。ただ、参照渡しにするということは変数の中身が書き代わる可能性を含むということなので、場合によってはconstを記述する。
値渡しと参照渡しとポインタ渡し - Windows より Mac より Linux がいい
C++ 速度比較(2) 参照渡し vs 値渡し vectorにおける比較 - のんびりしているエンジニアの日記