C++

[R8C][M16C] インライン関数とインラインアセンブラとテンプレートの関係

NC30のC++には、2種類のインライン関数があります。_inlineとinlineです。Cの場合には、これらは単に名前の違いだけで機能的な差異はありません。しかし、C++では全く別のものなので注意が必要です。

_inlineはCでも使える拡張機能で、ごく特殊なケースを除けば、確実にインライン置換されます。その代り、さまざまな制約があります。例えば、_inlineを使ったインライン関数内で静的オブジェクトを宣言すると、警告が出た上、翻訳単位ごとに別の実体が生成されます。また、再帰呼び出しもできなければ、関数へのポインタも取得できません。

inlineを使ったインライン関数はC++の仕様に基づきますが、デフォルトではインライン置換されません。インライン置換させるためには、-Ostatic_to_inlineおよび-Oforward_function_to_inlineオプションを付けてコンパイルする必要があります。もちろん、これらのオプションを付けたからといって、必ずインライン置換されるわけではありません。

[R8C][M16C] #pragma ADDRESSの調査

NC30には、指定したアドレスにオブジェクトを配置するための#pragma ADDRESS指令があります。これは通常、SFRにアクセスするために用いるもので、*(volatile unsigned char*)0x0052 などと書くより便利です。また、1ビットのビットフィールドにアクセスする場合には、bset などのビット命令に展開されるという強みもあります。

今回、まず初めに調査したのは、CとC++に共通した内容として、#pragma ADDRESSで使用したオブジェクトを直接使用した場合は効率のよいコードが生成されるけれども、ポインタや(C++の場合は)参照を使って間接的にアクセスした場合はどうかということです。実際試してみた結果、間接的にアクセスした場合はビット命令は生成されず、通常のオブジェクトと同じように扱われることが分かりました。

次に調査したのは、C++で#pragma ADDRESS指令を使う場合、オブジェクト名の指定はどの程度のことができるのかということです。というのは、Cであればオブジェクト名は単純な識別子で必ず表現できますが、C++の場合は、名前空間やクラス名やテンプレート引数が絡んでくるからです。

[R8C][M16C] NC30標準ライブラリのメモリ効率

R8CおよびM16Cの純正コンパイラNC30に付属している標準ライブラリを評価しています。弊社では、M16CよりはR8Cを使う機会が多いため、ローエンドのマイコン用ライブラリとしてどうかという観点で見るように心がけています。

ローエンドのマイコン用ということであれば、実行効率よりはメモリ効率の方が重要になるケースが多いはずです。特にRAMの使用量はかなり気になります。通常、シングルチップのマイコンというのは、ROMとRAMの両方を内蔵していますが、ROMよりRAMの方が圧倒的に小さいからです。そういう意味では、NC30付属の標準ライブラリにはいろいろと荒が目立ちます。

NC30の場合、標準ライブラリのソースファイルは以下の場所に格納されています。

itoaのテンプレート化

以前、「itoaを自作する」という記事を連載しました。そのときの最後に、itoaをC++のテンプレートを使って効率化する方法をそのうち書くことを予告しました。今回は、その内容になります。

テンプレート化するにあたって、まずは何をテンプレート引数にするかを考えなければなりません。最も安易な方法は、整数値の型と文字型をテンプレート引数にするというものです。

NC30で日本語識別子を使う

今回は、ルネサス製のマイコンM16CおよびR8C用のC/C++コンパイラであるNC30で日本語識別子を使う方法について考えてみることにします。以前、GCCで日本語識別子を使うという記事を書きましたが、それと同じ方法がNC30でも使えることが分かってきました。つまり、NC30でも国際文字名を使うことができるのです。

R8C/TinyのC++コンパイラ

前回は触りだけでしたので、詳細を小分けにして書いていきたいと思います。今回はルネサスの純正コンパイラNC30のC++コンパイラについてです。

NC30のC++コンパイラは、フロントエンドにEDGを使っているようですので、C++の一般的な部分に関してはある程度安心して使うことができるはずです。ですので、今回はNC30特有の部分、それも(M16Cではなく)R8C/Tiny特有の部分を中心に見ていくことにします。

R8C/Tinyの開発環境

今後、仕事でR8C/Tinyを使う機会が増えてきそうな予感がしているので、改めて開発環境について調査してみました。今回は、ほんの触りだけですが、そのレポートをしてみたいと思います。

続々・GCCで日本語識別子を使う

ちょっとしつこくなってきましたが、今回もGCCで日本語識別子を使う話題です。前回は実行時の影響でしたが、今回はコンパイル時のエラーメッセージの話です。

続・GCCで日本語識別子を使う

前回、多バイト文字を国際文字名に変換するための前処理を行い、その後、-fextended-identifiersオプションを付けてコンパイルすることで、GCCでも日本語識別子が使えるようになることを書きました。今回は、もう少し突っ込んで、日本語識別子(正確には多バイト文字の識別子)の実行時における影響について書いてみることにします。

GCCで日本語識別子を使う

GCCで日本語識別子を使う方法について、日本語の情報はあまり見かけませんので書き留めておきます。

バージョン4.1.xから-fextended-identifiersというコンパイルオプションが追加されています。現時点では実験的なもののようですが、特に問題なく動作しています。この-fextended-identifiersというのは、日本語の識別子を直接使えるようにするオプションではありません。できることは、国際文字名を有効にすることだけです。

コンテンツ配信
このエントリーを含むはてなブックマーク