extern
と __attribute__
の使い方を簡単に解説
はじめに
C言語やC++でプログラムを作るときに、プログラムの動きを速くしたり、デバッグ(問題を見つけて直すこと)を簡単にするために使える便利なキーワードがあります。ここでは、extern
と __attribute__
について、初心者でも分かりやすく説明します。
extern
とは?
extern
は普通、他のファイルから関数や変数を使えるようにするためのものです。しかし、今回はちょっと違った使い方を紹介します。特定の使い方をすることで、関数がインライン化(コードの中に直接展開されること)されるようにできます。
__attribute__
とは?
__attribute__
は、関数や変数に特別な性質を持たせるためのものです。これを使うことで、プログラムの動きを細かく制御できます。
特別な属性の説明
-
__gnu_inline__
:- この属性を使うと、関数がインライン化されます。関数のコードがそのまま関数を呼び出した場所に展開されるので、関数を呼び出す手間が省けます。
-
extern
と一緒に使うと、関数はインライン化されるだけで、普通の関数としては使われません。つまり、この関数はプログラムの中で直接使われる一部のように動作します。
-
__always_inline__
:- この属性は、「この関数は必ずインライン化しなさい」とコンパイラに命令します。どんな場合でも、この関数はインライン化されます。
-
__artificial__
:- この属性を使うと、デバッグ時に関数の中身の情報を省略できます。代わりに、関数が呼び出された場所の情報だけが表示されます。
実際のコード例
次のコード例を見てみましょう:
extern __inline __m256d __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm256_add_pd(__m256d __A, __m256d __B) {
return (__m256d)((__v4df)__A + (__v4df)__B);
}
コードの意味
このコードは次のことをしています:
-
_mm256_add_pd
という関数は、インライン化されてコードの中に直接展開されます。この関数は普通の関数としては使われません。 - この関数は必ずインライン化され、普通の関数呼び出しのようには動作しません。
- デバッグ時には、この関数の中身ではなく、呼び出し元の情報だけが表示されます。
まとめ
extern
と __attribute__
を使うことで、プログラムの動きを速くしたり、デバッグを簡単にしたりできます。この使い方を覚えておくと、プログラムを書くときにとても役立ちます。初めて使うときは少し難しく感じるかもしれませんが、例を参考にしながら使ってみると、だんだんと理解できるようになります。