この章では、最新の Solaris Studio C++ コンパイラの概要について説明します。
この節では、Solaris Studio 12.2 C++ 5.11 コンパイラリリースに導入された新機能と変更された機能の概要を一覧に示します。
-O オプションまたは -xO オプションとともに -g オプションを使用すると、インライン化が有効になります。(「A.2.30 -g」)
C++ オプション -xalias_level=compatible オプションを使用すると、プログラムが C++ 標準の要件を満たすことが表明されます。(「A.2.106 -xalias_level[= n]」)
Oracle Solaris にインストールされた Apache C++ ライブラリのサポートが追加されました。(「A.2.49 -library=l[ ,l...]」)
-compat=g オプションにより、Gnu g++ との互換性が部分的に実現されます。(「A.2.6 –compat[={ 4|5|g}]」)
-features=[no%]rvalueref オプションにより、特定のコンパイラチェックが無効になります。(「A.2.18 -features=a[ ,a...]」)
SPARC-V9 ISA の SPARC VIS3 バージョンのサポートが追加されました。-xarch=sparcvis3 オプションを使用してコンパイルすると、SPARC-V9 命令セットの命令、UltraSPARC および UltraSPARC-III 拡張機能、積和演算 (FMA) 命令、および VIS (Visual Instruction Set) バージョン 3.0 をコンパイラが使用できるようになります。(「A.2.109 -xarch=isa」)
x86 ベースのシステムに基づく -xvector オプションのデフォルト値が -xvector=simd に変更されました。(「A.2.187 -xvector[= a]」)
AMD SSE4a 命令セットのサポートが -xarch=amdsse4a オプションで使用できるようになりました。(「A.2.109 -xarch=isa」)
-traceback オプションを使用すると、重大なエラーが発生した場合に実行可能ファイルでスタックトレースを出力できます。(「A.2.94 -traceback[={ %none|common|signals_list}]」)
-mt オプションが -mt=yes または -mt=no に変更されています。(「A.2.55 -mt[={yes |no}]」)
#warning コンパイラ指令により、指令内のテキストが警告として発行され、コンパイルが続行されます。(「2.5.4 警告とエラー」)
新しいプラグマ does_not_read_global_data、does_not_write_global_data、および no_side_effect が追加されました。(「2.5.1 プラグマ」)
ヘッダーファイル mbarrier.h を使用できるようになりました。このヘッダーファイルは、SPARC プロセッサと x86 プロセッサでマルチスレッドコードのさまざまなメモリーバリアー組み込み関数を定義します。(「10.5 メモリーバリアー組み込み関数」)
-xprofile=tcov オプションが拡張されて、オプションのプロファイルディレクトリパス名がサポートされるようになりました。また、tcov 互換のフィードバックデータも生成できます。(「A.2.170 –xprofile=p」)
このリリースでは、-xMD オプションと -xMMD オプション (C/C++) により記述された依存関係ファイルにより、既存のファイルがすべて上書きされます。(「A.2.146 -xMD」)
x86 Solaris プラットフォーム用にコンパイルを行う場合に注意が必要な、重要な事項がいくつかあります。
従来の Sun スタイルの並列化プラグマがすべてのプラットフォームで使用できなくなりました。代わりに OpenMP を使用してください。従来の並列化命令を OpenMP に変換する方法については、『Solaris Studio 12.2: 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 でコンパイルします。
Solaris と Linux でも、固有の数学ライブラリ (たとえば、sin(x)) が同じではないため、演算結果が異なることがあります。
ILP32 32 ビットモデル用にコンパイルするには、—m 32 オプションを使用します。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 以降では、Solaris Studio コンパイラによってコンパイルされたプログラムのバイナリには、そのコンパイル済みバイナリによって想定されている命令セットを示すアーキテクチャーハードウェアフラグが付いています。実行時にこれらのマーカーフラグが検査され、実行しようとしているハードウェアで、そのバイナリが実行できることが確認されます。
プログラムにこれらのアーキテクチャーハードウェアフラグが含まれない場合、またはプラットフォームが適切な機能または命令セット拡張に対応していない場合、プログラムを実行することによりセグメント例外、または明示的な警告メッセージなしの不正な結果が発生することがあります。
このことは、.il インラインアセンブリ言語関数を使用しているプログラムや、SSE、SSE2、SSE2a、SSE3 の命令、およびより新しい命令と拡張機能を利用している __asm() アセンブラコードにも当てはまります。
この C++ コンパイラ (CC) は、ISO International Standard for C++, ISO IS 14882:2003, Programming Language - C++ に準拠しています。このリリースに含まれる README (最新情報) ファイルには、この規格の仕様と異なる記述が含まれています。
SPARC プラットフォームでは、このコンパイラは、UltraSPARC の実装と SPARC V8 と SPARC V9 の「最適化活用」機能をサポートします。これらの機能は、Prentice-Hall から出版された SPARC International による『SPARC アーキテクチャ・マニュアル バージョン 8 』(トッパン刊) と『SPARC ArchitectureManual, Version 9』(ISBN 0-13-099227-5) (英語版のみ)に定義されています。
このマニュアルでは、「標準」は、前述の規格の各バージョンに準拠していることを意味します。「非標準」および「拡張」は、これらの規格のバージョンに準拠しない機能のことを指します。
これらの標準は、それぞれの標準を策定する組織によって改訂されることがあります。したがって、コンパイラが準拠するバージョンの規格が改訂されたり、完全に書き換えられた場合、機能によっては、Solaris Studio C++ コンパイラの将来のリリースで前のリリースと互換性がなくなる場合があります。
C++ コンパイラの readme ファイルでは、コンパイラに関する重要な情報について説明しています。これは、『Oracle Solaris Studio 12.2 リリースの新機能』ガイドの一部となりました。次の内容が含まれています。
マニュアルの印刷後に判明した情報
新規および変更された機能
ソフトウェアの非互換性
問題および解決方法
制限および互換性の問題
出荷可能なライブラリ
実装されていない規格
『新機能』ガイドには、このリリースのドキュメント索引 (http://www.oracle.com/technetwork/server-storage/solarisstudio/documentation) からアクセスできます。
オンラインのマニュアルページ (man) では、コマンドや関数、サブルーチン、およびその機能に関する情報を簡単に参照できます。
マニュアルページを表示するには、次のように入力してください。
example% man topic |
C++ のドキュメント全体を通して、マニュアルページのリファレンスは、トピック名とマニュアルページの節番号で表示されます。CC(1) を表示するには、man CC と入力します。1 以外の節 (ieee_flags(3M) など) には、次のように man コマンドで -s オプションを使用してアクセスできます。
example% man -s 3M ieee_flags |
このリリースの C++ では、英語以外の言語を使用したアプリケーションの開発をサポートしています。対象としている言語は、ヨーロッパのほとんどの言語、中国語、日本語です。このため、アプリケーションをある言語から別の言語に簡単に置き換えることができます。この機能を国際化と呼びます。
通常 C++ コンパイラでは、次のように国際化を行なっています。
どの国のキーボードから入力された ASCII 文字でも認識する。つまりキーボードに依存せず、8 ビット透過となっています。
メッセージによっては現地語で出力できるものもある。
注釈、文字列、データに、現地語の文字を使用できる。
C++ は、Extended UNIX Character (EUC) 準拠の文字セットをサポートしています。この文字セットでは、文字列中のすべての NULL バイトが NULL 文字になります。また、文字列中で ASCII 値が / のバイトはすべて / 文字になります。
変数名は国際化できません。必ず英語の文字を使用してください。
アプリケーションをある国の言語から別の国の言語に変更するには、ロケールを設定します。言語の切り換えのサポートに関する情報については、オペレーティングシステムのドキュメントを参照してください。