章では、現在の Sun Studio C++ コンパイラに関する一般情報を説明します。。
この節では、Sun Studio 12 Update 1 C++ 5.10 コンパイラリリースで導入された新機能を簡単に説明します。各項目に記されている参照先に詳しい説明があります。
x86 プラットフォーム上の Solaris OS、または Linux OS 上のコンパイラで作成されたオブジェクトファイルは、_m128/_m64 データ型を使用するパラメータまたは戻り値を取る関数がアプリケーションコードの中に含まれている場合は、前のバージョンのコンパイラとは互換性がなくなります。.il インライン関数ファイル、アセンブラコード、またはこれらの関数を呼び出す asm インライン文を使用しているユーザーも、この非互換性に注意する必要があります。
-xtarget の新しい値は、 woodcrest、penryn、nehalem, core2 が x86 プロセッサ用、ultraT2plus と sparc64vii が SPARC プロセッサ用です。
-xarch の新しい値は、 ssse3、sse4_1、sse4_2 が x86 アーキテクチャー用、sparcima が SPARC アーキテクチャー用です。
SPARC プロセッサ用の —xchip の新しい値は、sparc64vii、ultraT2plus です。x86 プロセッサ用の —xchip の新しい値は、core2、penryn、 nehalem です。
-xprofile=collect と -xprofile=use の各オプションは、マルチスレッド化された動的リンクアプリケーションのサポートを改善します。
-xcrossfile=1 オプションは、-xipo=1 オプションの別名になりました。-xcrossfile=0 オプションは、効果がありません。明示的に表記すると、-xcrossfile=1 および -xcrossfile=0 は、-xipo=1 と同等です。
Solaris プラットフォームでは、-xpec[=yes| no] オプションを指定すると、自動チューニングシステム (Automatic Tuning System、ATS) と組み合わせて使用するために再コンパイル可能な PEC バイナリを生成します。
-Y オプションは、i を引数として受け入れません。
SPARC プラットフォームでは、-xdepend オプションは -x03 レベル以上の最適化では暗黙的に有効になり、-fast オプションの展開の中にはもう含まれません。
OpenMP 3.0 のサポートには、libmtsk ライブラリが含まれます。OpenMP プログラムは、Solaris OS 内の libmtsk ライブラリの代わりに、デフォルトでこのライブラリにリンクします。
-xannotate[=yes|no ] (SPARC プラットフォームのみ) は、binopt(1) のようなバイナリ変更ツールでのちに変換できるバイナリを作成するようコンパイラに指示します。
-xia (区間演算) オプションは現在、x86 上の Solaris プラットフォームでサポートされています。
-xipo_archive オプションは現在、x86 上の Solaris プラットフォームおよび Linux プラットフォームでサポートされています。
-Qoption オプションはもう、 ube_ipa を引数として受け入れません。
-fast オプションの展開には、 -D_MATHERR_ERRNO_DONTCARE が含まれます。
並列化警告メッセージを表示する -xvpara オプションがサポートされます。
-sb、-sbfast、-xsb 、および -xsbfast の各オプションは廃止され、削除されています。
-g オプションと、最適化に関する値である -O または -xO のいずれかを指定し、+d を指定しない場合は、コンパイラはコードをインライン化します。
must_have_frame プラグマがサポートされています。
標準 C++ では、switch 文内にある case のラベルに、値を 1 つ関連付けられます。Sun Studio C++ コンパイラでは、case 範囲として知られる、一部のコンパイラに見られる拡張を許可しています。
コンパイラは通常、 /tmp ディレクトリ内に一時ファイルを作成します。TMPDIR 環境変数を設定してほかのディレクトリを指定します。
関数の次の属性がサポートされるようになりました。 _attribute_((const)) _attribute_((constructor)) _attribute_((destructor))
struct と enum 型でのみ、変数の次の属性がサポートされます。 _attribute_((packed))
ユニバーサルキャラクタ名がサポートされます。
ループプラグマがサポートされます。
マクロの variadic (可変) 引数でユーザー定義名がサポートされます。
プリプロセッサのインクルードファイルを指定するための -include filename オプションが追加されました。
x86 Solaris プラットフォーム用にコンパイルを行う場合に注意が必要な、重要な事項がいくつかあります。
従来の Sun 仕様の並列化プログラムは、x86 では使用できません。代わりに OpenMP を使用してください。古い並列化命令を OpenMP に変換する方法については、『Sun Studio 12 Update 1: OpenMP API ユーザーズガイド』を参照してください。
-xarch を sse、sse2、sse2a、または sse3 以降に設定してコンパイルしたプログラムは、必ずこれらの拡張子と機能を提供するプラットフォームでのみ実行してください。
Solaris 9 4/04 以降の Solaris OS リリースは、Pentium 4 互換プラットフォームでは SSE/SSE2 に対応しています。これより前のバージョンの Solaris OS は SSE/SSE2 に対応していません。-xarch で選択した命令セットが、実行中の Solaris OS で有効ではない場合、コンパイラはその命令セットのコードを生成またはリンクできません。
コンパイルとリンクを個別に行う場合は、必ずコンパイラを使ってリンクし、同じ -xarch 設定で正しい起動ルーチンがリンクされるようにしてください。
x86 の 80 ビット浮動小数点レジスタが原因で、x86 での演算結果が SPARC の結果と異なる場合があります。この差を最小にするには、--fstore オプションを使用するか、ハードウェアが SSE2 をサポートしている場合は --xarch=sse2 でコンパイルします。
イントリンシック算術ライブラリ (sin(x) など) が異なるため、Solaris と Linux でも演算結果が数値的に異なる場合があります。
ILP32 32 ビットモデル用にコンパイルするには、—m32 オプションを使用します。ILP64 64 ビットモデル用にコンパイルするには、—m64 オプションを使用します。
ILP 32 モデルでは、C++ 言語の int、long、およびポインタデータ型はすべて 32 ビット幅であることを指定します。long およびポインタデータ型を指定する LP64 モデルは、すべて 64 ビット拡張です。Solaris および Linux OS は、LP64 メモリーモデルの大きなファイルや配列もサポートします。
—m64 を使用してコンパイルを行う場合、結果の実行可能ファイルは、64 ビットカーネルを実行する Solaris OS または Linux OS の 64 ビット UltraSPARC または x86 プロセッサでのみ動作します。コンパイル、リンク、および 64 ビットオブジェクトの実行は、64 ビット実行をサポートする Solaris または Linux OS でのみ行うことができます。
Solaris システムの Sun Studio 11 以降では、Sun Studio コンパイラによってコンパイルされたプログラムのバイナリには、そのコンパイル済みバイナリによって想定されている命令セットを示すアーキテクチャーハードウェアフラグが付いています。実行時にこれらのマーカーフラグが確認され、実行しようとしているハードウェアで、そのバイナリが実行できることが確認されます。
プログラムにこれらのアーキテクチャーハードウェアフラグが含まれない場合、またはプラットフォームが適切な機能または命令セット拡張に対応していない場合、プログラムを実行することによりセグメント例外、または明示的な警告メッセージなしの不正な結果が発生することがあります。
この警告は、.il インラインアセンブリ言語関数を使用しているプログラムや、SSE、SSE2、SSE2a、SSE3、およびより新しい命令と拡張機能を利用している __asm() アセンブラコードにも当てはまります。
この C++ コンパイラ (CC) は、ISO International Standard for C++, ISO IS 14882:2003, Programming Language - C++ に準拠しています。このリリースに含まれる README (最新情報) ファイルには、この規格の仕様と異なる記述が含まれています。
SPARCTM プラットフォームでは、このコンパイラは、UltraSPARC の実装と SPARC V8 と SPARC V9 の「最適化活用」機能をサポートします。これらの機能は、Prentice-Hall から出版された SPARC International による『SPARC アーキテクチャ・マニュアル バージョン 8 』(トッパン刊) と『SPARC ArchitectureManual, Version 9』(ISBN 0-13-099227-5) (英語版のみ)に定義されています。
このマニュアルでは、「標準」は、前述の規格の各バージョンに準拠していることを意味します。「非標準」および「拡張」は、これらの規格のバージョンに準拠しない機能のことを指します。
これらの標準は、それぞれの標準を策定する組織によって改訂されることがあります。したがって、コンパイラが準拠するバージョンの規格が改定されたり、完全に書き換えられた場合、機能によっては、Sun C++ コンパイラの将来のリリースで前のリリースと互換性がなくなる場合があります。
C++ コンパイラの README ファイルでは、コンパイラに関する重要な情報を取り上げています。これらの情報は次のとおりです。
マニュアルの印刷後に判明した情報
新規および変更された機能
ソフトウェアの非互換性
問題および解決方法
制限および互換性の問題
出荷可能なライブラリ
実装されていない規格
Sun Studio の今回のリリースと以前のリリースに関する C++ コンパイラの Readme は、Sun Developer Network の Sun Studio ポータル http://developers.sun.com/sunstudio/documentation で入手できます。
オンラインのマニュアルページ (man) では、コマンドや関数、サブルーチン、およびその機能に関する情報を簡単に参照できます。
マニュアルページを表示するには、次のように入力してください。
example% man topic |
C ++ のマニュアル全体を通して、マニュアルページのリファレンスは、トピック名とマニュアルのセクション番号で表示されます。CC(1) を表示するには、man CC と入力 します。たとえば ieee_flags(3M) など、ほかのセクションを表示するには、man コマンドに -s オプションを使用します。
example% man -s 3M ieee_flags |
このリリースの C++ では、英語以外の言語を使用したアプリケーションの開発をサポートしています。対象としている言語は、ヨーロッパのほとんどの言語と日本語です。このため、アプリケーションをある言語から別の言語に簡単に置き換えることができます。この機能を国際化と呼びます。
通常 C++ コンパイラでは、次のように国際化を行なっています。
どの国のキーボードから入力された ASCII 文字でも認識する。つまりキーボードに依存せず、8 ビット透過となっています。
メッセージによっては現地語で出力できるものもある。
注釈、文字列、データに、現地語の文字を使用できる。
C++ は、Extended UNIX Character (EUC) 準拠の文字セットをサポートしています。この文字セットでは、文字列中のすべての NULL バイトが NULL 文字になります。また、文字列中で ASCII 値が '/' のバイトはすべて '/' 文字になります。
変数名は国際化できません。必ず英語の文字を使用してください。
アプリケーションをある国の言語から別の国の言語に変更するには、ロケールを設定します。言語の切り換えのサポートに関する情報については、オペレーティングシステムのマニュアルを参照してください。