今回のブログでは、bcc64xに関するちょっとしたお役立ち情報やヒントについてご紹介させていただきます。bcc64x.exeは、新しいWin64 C++ツールチェーンのコンパイラの名称です。
Table of Contents
警告数が少ないほど、コンパイルが速くなるって本当?
はい、本当です。コンパイラからの警告数が増えれば増えるほど、コンパイル速度は遅くなる傾向があり、その速度低下は顕著に実感できます。
ただ、表示される警告には非常に意味があります。
-Wall オプションを追加し、コンパイルすると、全ての警告が対象となり、表示される警告数に応じてコンパイル速度が低下する恐れがありますが、コンパイラから通知される警告は、今まで見落としていたコードの問題を顕在化してくれる手かがりになりますので、 -Wall オプションを有効にしてコンパイルすることをお勧めいたします。
メモリ使用後の解放
メモリが0x80バイトコードで埋められるトラップ(クラッシュ)に遭遇したことはありますか? (例えば、「アドレス0x000012341234abcdでアクセス違反」と表示され、そのメモリを参照すると、データ値が0x80808080になっている場合など)
この症状は、メモリが解放された後に使用されている場所を指しています。新しいRTL のメモリマネージャでは、解放されたメモリをすべてこのバイトパターンでマークし、nullではなく、0x80バイトコードでメモリを埋めます。これにより、使用されるべきでないメモリが使用された場合、簡単に発見することができます。
未初期化変数の有無を確認する
-Wallオプションでビルドできない場合は、最低でも-Wuninitializedオプションでビルドして、値が初期化される前に変数が使用されているかキャッチアップしてください。これにより、新しいコンパイラによってトラップが発行されます。(詳しくは、こちらのブログを参照ください。)ただ、実際には-Wallオプションを推奨します。その理由については、こちらのブログを参照ください。コンパイラが潜在的で厄介なバグを検出してくれます。
bcc64xによる高速並列コンパイルの使用
C++Builder 12.2をインストールし、新しいプラットフォームを使用する際には、新しい並列コンパイルシステムがデフォルトで使用されます。この新しい並列コンパイルシステムは、IDE でのビルドと、msbuild を使用したコマンド ラインでのビルドに使用されます。
bcc64xを直接使用したい場合は、以下のように–jobsパラメータを使用してください。
1 |
> bcc64x a.cpp b.cpp c.cpp --jobs=0 ...(other options) |
これはファイルをバッチ処理し(a.cpp、b.cpp、c.cppなど、多数のソースを同じコマンドラインで一度に送信)、ジョブを使用してバッチ処理されたすべてのファイルを並列でコンパイルします。「0」はCPUを飽和させることを意味する値です。-1を指定すると、ほぼ飽和状態になりますが、完全に飽和するわけではありません。また、任意の正の整数を指定すると、その数に応じたコアを使用します。
新しいコンパイラのテストコード
エンバカデロの検証では、mingw-llvmで動作、またはmsys2で利用可能なオープンソースのC++ライブラリは、bcc64xでも動作する可能性が高いことが判っています。ただし、一部のライブラリには BORLANDC用のifdefがあり、この定義を削除する必要のあることが稀にあります (現在はほとんど該当しませんが、もしこの問題に遭遇した場合は回避策になります)。
したがって、ほとんどのC++ソースでは、この新しいコンパイラ向けにテストを行う必要はありませんが、C++Builder 12.2へアップグレードする際、例えば、過去バージョンで作成したプロジェクト(古いライブラリも含む)をビルドするケースの場合、新しいコンパイラ向けのテストを行う必要があるかもしれません。
エンバカデロのC++コンパイラがClang 15以降をベースにしているか否かをチェックするためには、以下のdefine文を定義します。
1 |
#if defined(__CODEGEARC__) && (__clang_major__ >= 15) |
例えば、テストコードの例は以下の通りです。
もしテストする必要がある場合は、エンバカデロでは以下のようなテストを推奨いたします。
1 2 3 4 5 6 7 8 9 10 11 |
#include <iostream> #include <tchar.h> int _tmain(int argc, _TCHAR* argv[]) { #if defined(__CODEGEARC__) && (__clang_major__ >= 15) std::cout << "C++Builder Modern Compiler, 12.x or newer"; #else std::cout << "A different compiler"; #endif } |
エンバカデロが今後C++コンパイラを更新し続けても、上記のテストコードでチェックが可能です。
ウェビナーについて
本ブログの内容は、エンバカデロのC++のブロダクトマネージャである「David Millington」が、ウェビナー内で「Tip #7, bcc64x tips」という節でフル尺で解説しています。このウェビナーはC++Builder / RAD Studio 12.2の新しいWin64 モダンツールチェインを活用するためのヒントや非常に有益な情報を紹介しています。もしウェビナー(英語)をご覧になりたい場合は、以下をご参照ください。
「Tip #7, bcc64x tips」の節は、下記の動画の「1:21:15〜」です。
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition