C++ のキーワード†
プリプロセッサ†
#error <error-message>†
- プリプロセッサ実行時、そこを通ると<error-message>を出力して処理を停止する。
- 書式:
#error "error-message"
初期化†
継承される可能性のあるclassは、デストラクタを仮想にする†
- これは下記のような問題を回避する為。
- 継承した子クラスを作る
- その子クラスが、親クラスの型で自分のインスタンスのポインタを返すような使い方をされる場合がある。
- このとき、その親クラスのポインタに対して delete をしてしまうと、子クラスの部分だけがdeleteされていない、中抜けのおかしな実体になってしまう。
- その中抜けなインスタンスに対してアクセスすると、そのときの動作が未定義になってしまう。
型の別名宣言 using†
型を別名宣言する場合†
関数ポインタに対して宣言する場合†
typedef void (*funcptr)(int); // typedef を使用する場合
using funcptr = void (*)(int); // using を使用する場合
コンパイル時に構造体のサイズを知る†
- 下記のようなマクロを仕込むことで、コンパイル時に構造体 foo のサイズが取得出来る。
#define PRINT_SIZEOF(type) PRINT_SIZEOF_(type, __LINE__)
#define PRINT_SIZEOF_(type, line) \
void print_sizeof_##line() { asm volatile("size of " #type " is %0" :: "g"(sizeof(type))); }
struct foo {
type variable;
};
PRINT_SIZEOF(struct foo)
- これを実行するとエラーが発生し、その際に構造体サイズがコンパイルログとして出力される。
cast†
static_cast†
dynamic_cast†
const_cast†
- const キャスト
- 変換元の型から const 装飾子や volatile 装飾子を除去する為に用いる。
- const 修飾子を取り除くこと(=元々変更出来ない筈のオブジェクトが変更される可能性が生じる)や、volatile 修飾子を取り除くこと(=アクセスすべきオブジェクトにアクセスが行われなくなる可能性が生じる)は好ましくない為、他に方法がない場合以外では使用しないことが望ましい。
reinterpret_cast†
- 再解釈キャスト
- 使用場面
- 互換性のないポインタ型同士の変換
- 整数型とポインタ型との間の変換
- このキャストを用いて「ポインタ型→整数型(但し、桁溢れを起こさない型であること)→元のポインタ型」な変換を行った場合、最後のポインタ型は最初のポインタ型と同一の値であることが保証される。
- 下記の制限事項がある:
- cv 修飾の削除は出来ない
- メンバポインタと非メンバポインタ間の変換は出来ない
- メンバ変数へのポインタとメンバ関数へのポインタ間の変換は出来ない
- メンバ関数のポインタと非メンバ関数へのポインタの変更は出来ない
new / delete†
new†
delete†
配置 new†
アライメント†
アライメントの取得†
アライメントの指定†
そもそも、アライメントとは?†
- アライメントは、オブジェクトのための領域をメモリ上に配置する際のアドレスの境界位置のこと。
- 例えば int のサイズが 4 byte の環境では、アライメントは 4 の倍数となり、 4 の倍数のアドレスに配置することで int 型変数の領域に高速にアクセス出来るようになる場合がある。
- CPU によっては、アライメントに合わない位置に配置されたオブジェクトにはアクセスできない場合がある。
- それぞれの型のオブジェクトは、alignof() で返された値の倍数となるアドレスに配置する必要がある。
gcc / g++†
- gcc (g++) で std ライブラリを使用したコードを make する際、libstdc++.a が必要になる
LDFLAGS += -lstdc++
参考リンク†