[C/C++]よくないキーワード(リザーブワード)


restrictキーワード
restrictキーワードは実はC言語ならではで、C 99が提案したもので、現在C++はまだサポートされていません.
1つのポインタが宣言された役割ドメイン内にある場合、ポインタが指すメモリ領域のデータはすべて、他のポインタではなくアクセスできます.コンパイラはこれをチェックします.
このような結果は、コンパイラがより良いコード最適化を行い、より効率的なアセンブリコードを生成することを支援することである.
現在C 99のみサポートされているため、コンパイルコマンドは以下の通りです.
gcc -std=c99 test.c -o test.bin
注意:g++は-std=c 99をサポートせず、restrictキーワードもサポートしていません.
 
例:
void f(const int *restrict src, int *restrict dst )
{
	*dst = (*src) + 1;
}
int main()
{
	int n = 0;
	f( &n, &n); //       ,    restrict   ,       
	return 0;
}

コンパイラによるrestrictの最適化
//   x y    ,         
int foo (int* x, int* y)
{
	*x = 0;
	*y = 1;
	return *x;
}

//   x y   ,             0,          return 0;               0  
int foo(int *restrict x, int *restrict y)
{
	*x = 0;
	*y = 1;
	return *x;
}

restrictの使用は「君子協定」です
//             ,restrict           
//                 copy,            。
void mycopy( const void *restrict src, void *restrict dst, int size )
{
    if( size <= 0 || src == NULL || dst == NULL ) return;
    const char* s = ( char* )src;
    char* d = ( char* )dst;
    while( size-- ) *d++ = *s++;
}

int main()
{
    char array[100] = { 0 };
    mycopy( array, array + 10, 50);
    return 0;
}

参考記事
http://blog.sina.com.cn/s/blog_530bce2d0100crxu.html
http://hi.baidu.com/oney131/blog/item/10f71f1f0b5033174034176e.html
 
explicitキーワード
許可すべきでない変換構造関数による暗黙的な変換の発生を阻止する.explicitとして宣言されたコンストラクション関数は、暗黙的な変換では使用できません.
C++では、1つのパラメータのコンストラクション関数(または、最初のパラメータを除く残りのパラメータにデフォルト値のマルチパラメトリックコンストラクション関数)が、2つの役割を果たします.1はコンストラクタ2であり、デフォルトで隠されているタイプ変換オペレータです.
したがって、AAA=XXXのようなコードを書く場合があり、ちょうどXXXのタイプはAAA単一パラメータコンストラクタのパラメータタイプであり、コンパイラは自動的にこのコンストラクタを呼び出し、AAAのオブジェクトを作成します.
class Test1
{
public:
	Test1(int n) { num = n; } //      
private:
	int num;
};

class Test2
{
public:
	explicit Test2(int n) { num = n; } //explicit(  )    
private:
	int num;
};

int main()
{
	Test1 t1 = 12; //         ,   
	Test2 t2 = 12; //    ,           
	Test2 t3(12); //      
	return 0;

} 

volatileキーワード
volatileキーワードは、この変数は最適化できず、レジスタに勝手にキャッシュすることができず、毎回メモリから値を再ロードすることをコンパイラに伝えます.
これはマルチスレッド環境でよく見られ、1つの変数が複数のスレッドに共通している場合です.