Sun Studio 12 Update 1: C++ ユーザーズガイド

パート I C++ コンパイラ

第 1 章 C++ コンパイラの紹介

章では、現在の Sun Studio C++ コンパイラに関する一般情報を説明します。。

1.1 Sun Studio 12 Update 1 C++ 5.10 コンパイラの新機能

この節では、Sun Studio 12 Update 1 C++ 5.10 コンパイラリリースで導入された新機能を簡単に説明します。各項目に記されている参照先に詳しい説明があります。

1.2 x86 の特記事項

x86 Solaris プラットフォーム用にコンパイルを行う場合に注意が必要な、重要な事項がいくつかあります。

従来の Sun 仕様の並列化プログラムは、x86 では使用できません。代わりに OpenMP を使用してください。古い並列化命令を OpenMP に変換する方法については、『Sun Studio 12 Update 1: OpenMP API ユーザーズガイド』を参照してください。

-xarchssesse2sse2a、または 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 でも演算結果が数値的に異なる場合があります。

1.3 64 ビットプラットフォーム用のコンパイル

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 でのみ行うことができます。

1.4 バイナリの互換性の妥当性検査

Solaris システムの Sun Studio 11 以降では、Sun Studio コンパイラによってコンパイルされたプログラムのバイナリには、そのコンパイル済みバイナリによって想定されている命令セットを示すアーキテクチャーハードウェアフラグが付いています。実行時にこれらのマーカーフラグが確認され、実行しようとしているハードウェアで、そのバイナリが実行できることが確認されます。

プログラムにこれらのアーキテクチャーハードウェアフラグが含まれない場合、またはプラットフォームが適切な機能または命令セット拡張に対応していない場合、プログラムを実行することによりセグメント例外、または明示的な警告メッセージなしの不正な結果が発生することがあります。

この警告は、.il インラインアセンブリ言語関数を使用しているプログラムや、SSE、SSE2、SSE2a、SSE3、およびより新しい命令と拡張機能を利用している __asm() アセンブラコードにも当てはまります。

1.5 準拠規格

この 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++ コンパイラの将来のリリースで前のリリースと互換性がなくなる場合があります。

1.6 C++ README ファイル

C++ コンパイラの README ファイルでは、コンパイラに関する重要な情報を取り上げています。これらの情報は次のとおりです。

Sun Studio の今回のリリースと以前のリリースに関する C++ コンパイラの Readme は、Sun Developer Network の Sun Studio ポータル http://developers.sun.com/sunstudio/documentation で入手できます。

1.7 マニュアルページ

オンラインのマニュアルページ (man) では、コマンドや関数、サブルーチン、およびその機能に関する情報を簡単に参照できます。

マニュアルページを表示するには、次のように入力してください。


example% man topic

C ++ のマニュアル全体を通して、マニュアルページのリファレンスは、トピック名とマニュアルのセクション番号で表示されます。CC(1) を表示するには、man CC と入力 します。たとえば ieee_flags(3M) など、ほかのセクションを表示するには、man コマンドに -s オプションを使用します。


example% man -s 3M ieee_flags

1.8 各国語のサポート

このリリースの C++ では、英語以外の言語を使用したアプリケーションの開発をサポートしています。対象としている言語は、ヨーロッパのほとんどの言語と日本語です。このため、アプリケーションをある言語から別の言語に簡単に置き換えることができます。この機能を国際化と呼びます。

通常 C++ コンパイラでは、次のように国際化を行なっています。

変数名は国際化できません。必ず英語の文字を使用してください。

アプリケーションをある国の言語から別の国の言語に変更するには、ロケールを設定します。言語の切り換えのサポートに関する情報については、オペレーティングシステムのマニュアルを参照してください。

第 2 章 C++ コンパイラの使用方法

この章では、C++ コンパイラの使用方法を説明します。

コンパイラの主な目的は、C++ などの高水準言語で書かれたプログラムをコンピュータハードウェアで実行できるデータファイルに変換することです。C++ コンパイラでは次のことができます。

2.1 コンパイル方法の概要

この節では、C++ コンパイラを使って C++ プログラムのコンパイルと実行をどのように行うかを簡単に説明します。コマンド行オプションの詳しい説明については、「16.8 dlopen を使って C プログラムから C++ ライブラリにアクセスする」を参照してください。


注 –

この章のコマンド行の例は、CC の使用方法を示すためのものです。実際に出力される内容はこれと多少異なる場合があります。


C++ アプリケーションを構築して実行するには、基本的に次の手順が必要です。

  1. エディタを使用して、表 2–1 に一覧表示されている有効な接尾辞の 1 つを指定し、C++ ソースファイルを作成する。

  2. コンパイラを起動して実行可能ファイルを作成する。

  3. 実行可能ファイルの名前を入力してプログラムを実行する。

次のプログラムは、メッセージを画面に表示する例です。


example% cat greetings.cc
    #include <iostream>
    int main()  {
      std::cout << “Real programmers write C++!” << std::endl;
      return 0;
    }
example% CC greetings.cc
example% ./a.out
 Real programmers write C++!
example%

この例では、ソースファイル greetings.ccCC でコンパイルしています。デフォルトでは、実行可能ファイルがファイル a.out として作成されます。プログラムを起動するには、コマンドプロンプトで実行可能ファイル名 a.out を入力します。

従来、UNIX コンパイラは実行可能ファイルに a.out という名前を付けていました。しかし、すべてのコンパイルで同じファイルを使用するのは不都合な場合があります。そのファイルがすでにあれば、コンパイラを実行したときに上書きされてしまうからです。次の例のように、コンパイラオプションに -o を使用すれば、実行可能出力ファイルの名前を指定できます。


example% CC– o greetings greetings.cc

この例では、-o オプションを指定することによって、実行可能なコードがファイル greetings に書き込まれます。プログラムにソースファイルが 1 つだけしかない場合は、ソースファイル名から接尾辞を除いたものをそのプログラム名にすることが一般的です。

あるいは、コンパイルのあとに mv コマンドを使って、デフォルトの a.out ファイルを別の名前に変更することもできます。いずれの場合も、実行可能ファイルの名前を入力して、プログラムを実行します。


example% ./greetings
Real programmers write C++!
example%

2.2 コンパイラの起動

このあとの節では、CC コマンドで使用する規約、コンパイラのソース行指令など、コンパイラの使用に関連する内容について説明します。

2.2.1 コマンド構文

コンパイラの一般的なコマンド行の構文を次に示します。


CC [options] [source-files] [object-files] [libraries]

options は、先頭にダッシュ (-) またはプラス記号 (+) の付いたキーワード (オプション) です。このオプションには、引数をとるものがあります。

通常, コンパイラオプションの処理は、左から右へと行われ、マクロオプション (ほかのオプションを含むオプション) は、条件に応じて内容が変更されます。ほとんどの場合、同じオプションを 2 回以上指定すると、最後に指定したものだけが有効になり、オプションの累積は行われません。次の点に注意してください。

ソースファイル、オブジェクトファイル、およびライブラリは、コマンド行に指定した順にコンパイルとリンクが行われます。

次の例では、CC を使って 2 つのソースファイル (growth.Cfft.C) をコンパイルし、実行時デバッグを有効にして growth という名前の実行可能ファイルを作成します。


example% CC -g -o growth growth.C fft.C

2.2.2 ファイル名に関する規則

コンパイラがコマンド行に指定されたファイルをどのように処理するかは、ファイル名に付加された接尾辞で決まります。次の表以外の接尾辞を持つファイルや、接尾辞がないファイルはリンカーに渡されます。

表 2–1 C++ コンパイラが認識できるファイル名接尾辞

接尾辞 

言語 

処理  

.c

C++ 

C++ ソースファイルとしてコンパイルし、オブジェクトファイルを現在のディレクトリに入れる。オブジェクトファイルのデフォルト名は、ソースファイル名に .o 接尾辞が付いたものになる。

.C

C++ 

.c 接尾辞と同じ処理。

.cc

C++ 

.c 接尾辞と同じ処理。

.cpp

C++ 

.c 接尾辞と同じ処理。

.cxx

C++ 

.c 接尾辞と同じ処理。

.c++

C++ 

.c 接尾辞と同じ処理。

.i

C++ 

C++ ソースファイルとして扱われるプリプロセッサ出力ファイル。.c 接尾辞と同じ処理。

.s

アセンブラ 

ソースファイルをアセンブラを使ってアセンブルする。 

.S

アセンブラ 

C 言語プリプロセッサとアセンブラを使ってソースファイルをアセンブルする。 

.il

インライン展開 

アセンブリ用のインラインテンプレートファイルを使ってインライン展開を行う。コンパイラはテンプレートを使って、選択されたルーチンのインライン呼び出しを展開します(インラインテンプレートファイルは、特殊なアセンブラファイルです。inline(1) のマニュアルページを参照してください)。

.o

オブジェクトファイル 

オブジェクトファイルをリンカーに渡す 

.a

静的 (アーカイブ) ライブラリ 

オブジェクトライブラリの名前をリンカーに渡す。 

.so

.so.n

動的 (共有) ライブラリ 

共有オブジェクトの名前をリンカーに渡す。 

2.2.3 複数のソースファイルの使用

C++ コンパイラでは、複数のソースファイルをコマンド行に指定できます。コンパイラが直接または間接的にサポートするファイルも含めて、コンパイラによってコンパイルされる 1 つのソースファイルを「コンパイル単位」といいます。C++ では、それぞれのソースが別個のコンパイル単位として扱われます。

2.3 バージョンが異なるコンパイラでのコンパイル

このコンパイラは、デフォルトではキャッシュを使用しません。キャッシュを使用するのは、-instances=extern が指定されているときだけです。キャッシュを使用する場合、コンパイラはキャッシュディレクトリのバージョンを調べ、その結果キャッシュバージョンに問題があることがわかると、エラーメッセージを出力します。将来の C++ コンパイラもキャッシュのバージョンを調べます。たとえば、将来のコンパイラは異なるテンプレートキャッシュのバージョン識別子を持っているため、現在のリリースで作成されたキャッシュディレクトリを処理しようとすると、次のようなエラーを出力します。


Template Database at ./SunWS_cache is incompatible with
this compiler

同様に、現在のリリースのコンパイラで以降のバージョンのコンパイラで作成されたキャッシュディレクトリを処理しようとすると、エラーが発行されます。

コンパイラをアップグレードする際には、必ずキャッシュを消去するようにするとよいでしょう。テンプレートキャッシュディレクトリ (ほとんどの場合、テンプレートキャッシュディレクトリの名前は SunWS_cache) が入っているディレクトリすべてに対し、CCadmin -clean を実行します。CCadmin -clean の代わりに、rm -rf SunWS_cache と指定しても同様の結果が得られます。

2.4 コンパイルとリンク

この節では、プログラムのコンパイルとリンクについていくつかの側面から説明します。次の例では、CC を使って 3 つのソースファイルをコンパイルし、オブジェクトファイルをリンクして prgrm という実行可能ファイルを作成します。


example% CC file1.cc file2.cc file3.cc -o prgrm

2.4.1 コンパイルとリンクの流れ

前の例では、コンパイラがオブジェクトファイル (file1.ofile2.ofile3.o)を自動的に生成し、次にシステムリンカーを起動してファイル prgrm の実行可能プログラムを作成します。

コンパイル後も、オブジェクトファイル (file1.ofile2.o、および file3.o) はそのまま残りま。この規則のおかげで、ファイルの再リンクと再コンパイルを簡単に行えます。


注 –

ソースファイルが 1 つだけであるプログラムに対してコンパイルとリンクを同時に行なった場合は、対応する .o ファイルが自動的に削除されます。複数のソースファイルをコンパイルする場合を除いて、すべての .o ファイルを残すためにはコンパイルとリンクを別々に行なってください。


コンパイルが失敗すると、エラーごとにメッセージが返されます。エラーがあったソースファイルの .o ファイルは生成されず、実行可能プログラムも作成されません。

2.4.2 コンパイルとリンクの分離

コンパイルとリンクは別々に行うことができます。-c オプションを指定すると、ソースファイルがコンパイルされて .o オブジェクトファイルが生成されますが、実行可能ファイルは作成されません。-c オプションを指定しないと、コンパイラはリンカーを起動します。コンパイルとリンクを分離すれば、1 つのファイルを修正するためにすべてのファイルを再コンパイルする必要はありません。次の例では、最初の手順で 1 つのファイルをコンパイルし、次の手順でそれをほかのファイルとリンクします。


example% CC -c file1.cc         Make new object file
example% CC -o prgrm file1.o file2.o file3.o       Make executable file

リンク時には (2 行目)、完全なプログラムを作成するのに必要なすべてのオブジェクトファイルを必ず 指定してください。オブジェクトファイルが足りないと、リンクは「undefined external reference (未定義の外部参照がある)」エラーで、ルーチンがないために失敗します。

2.4.3 コンパイルとリンクの整合性

コンパイルとリンクを別々に実行する場合で、「3.3.3 コンパイル時とリンク時のオプション」に示すコンパイラオプションを使用する場合は、コンパイルとリンクの整合性を保つことが非常に重要です。

これらのオプションのいずれかを使用してサブプログラムをコンパイルした場合は、リンクでも同じオプションを使用してください。

次の例では、-library=stlport4 コンパイラオプションを使用してプログラムをコンパイルしています。


 example% CC -library=stlport4 sbr.cc -c
example% CC -library=stlport4 main.cc -c
example% CC -library=stlport4 sbr.o main.o -o myprogram 

-library=stlport4 を一貫して使用しない場合は、プログラムの特定の部分はデフォルトの libCstd を使用し、ほかの部分はオプションの置換である STlport ライブラリを使用します。結果として得られたプログラムは正常にリンクできず、どのような状況でも正常に動作しません。

プログラムがテンプレートを使用する場合は、リンク時にその中のいくつかがインスタンス化される可能性があります。その場合、インスタンス化されたテンプレートは最終行 (リンク行) のコマンド行オプションを使用してコンパイルされます。

2.4.4 64 ビットメモリーモデル用のコンパイル

新しい -m64 オプションを使用して、対象コンパイルのメモリーモデルを指定します。結果の実行可能ファイルは、64 ビットカーネルを実行する Solaris OS または Linux OS の配下にある、64 ビットの UltraSPARC または x86 プロセッサでのみ動作します。コンパイルリンク、および 64 ビットオブジェクトの実行は、64 ビット実行をサポートする Solaris または Linux OS でのみ行うことができます。

2.4.5 コンパイラの診断

-V オプションを指定すると、CC によって起動された各プログラムの名前とバージョン番号が表示されます。-v オプションを指定すると、CC によって起動されたコマンド行全体が表示されます。

—verbose=%all を指定すると、コンパイラに関する追加情報が表示されます。

コマンド行に指定された引数をコンパイラが認識できない場合には、それらはリンカーオプション、オブジェクトプログラムファイル名、ライブラリ名のいずれかとみなされます。

基本的には次のように区別されます。

次の例で、-bitCC によって認識されないため、リンカー (ld) に渡されます。リンカーはこれを解釈しようとします。単一文字の ld オプションは連続して指定できるので、リンカーは -bit-b-i、-t とみなします。これらはすべて有効な ld オプションです。しかし、これは本来の意図とは異なります。


example% CC -bit move.cc           < - -bit is not a recognized CC option

CC: Warning: Option -bit passed to ld, if ld is invoked, ignored otherwise

次の例では、CC オプション -fast を指定しようとしましたが、先頭のダッシュ (-) を入力しませんでした。コンパイラはこの引数もリンカーに渡します。リンカーはこれをファイル名とみなします。


example% CC fast move.cc           < -  The user meant to type -fast
move.CC:
ld: fatal: file fast: cannot open file; errno=2
ld: fatal: File processing errors. No output written to a.out

2.4.6 コンパイラの構成

C++ コンパイラパッケージは、フロントエンド (CC コマンド本体)、オプティマイザ (最適化)、コードジェネレータ (コード生成)、アセンブラ、テンプレートのプリリンカー (リンクの前処理をするプログラム)、リンクエディタから構成されています。コマンド行オプションでほかの指定を行わないかぎり、CC コマンドはこれらの構成要素をそれぞれ起動します。

これらの構成要素はいずれもエラーを生成する可能性があり、構成要素はそれぞれ異なる処理を行うため、エラーを生成した構成要素を識別することがエラーの解決に役立つことがあります。それには、-v オプションと -dryrun オプションを使用します。

次の表に示すように、コンパイラの構成要素への入力ファイルには異なるファイル名接尾辞が付いています。どのようなコンパイルを行うかは、この接尾辞で決まります。ファイル名接尾辞の意味については、表 2–1 を参照してください。

表 2–2 C++ コンパイルシステムの構成要素

コンポーネント 

内容の説明  

使用時の注意  

ccfe

フロントエンド (コンパイラプリプロセッサ (前処理系) とコンパイラ) 

 

iropt

コードオプティマイザ 

-xO[2-5]、-fast

ir2hf

x86: 中間言語トランスレータ 

-xO[2-5]、-fast

inline

SPARC: アセンブリ言語テンプレートのインライン展開 

.il ファイルを指定

fbe

アセンブラ 

 

cg

SPARC: コード生成、インライン機能、アセンブラ 

 

ube

x86: コードジェネレータ 

-xO[2-5]、-fast

CClink

テンプレートのプリリンカー 

-instances=extern オプションのみで使用します。

ld

リンクエディタ 

 

2.5 指示および名前の前処理

この節では、C++ コンパイラ特有の前処理の指示について説明します。

2.5.1 プラグマ

プリプロセッサ指令 pragma は C++ 標準の一部ですが、書式、内容、および意味はコンパイラごとに異なります。C++ コンパイラが認識するプラグマ (指令) の詳細は、付録 B プラグマを参照してください。

Sun C++ は、C99 のキーワードである _Pragma もサポートしています。これら 2 つの呼び出し


#pragma dumpmacros(defs)     
_Pragma("dumpmacros(defs)") 

は同等です。_Pragma の代わりに _Pragma を使用するには、プラグマテキストをリテラル文字列として記述し、_Pragma キーワードの 1 つの引数として括弧で囲みます。

2.5.2 可変数の引数をとるマクロ

C++ コンパイラでは次の書式の #define プリプロセッサの指示を受け入れます。


#define identifier (...) replacement_list
#define identifier (identifier_list, ...) replacement_list

マクロパラメータリストの終わりが省略符号である場合、マクロパラメータより多くの引数をマクロの呼び出しで使用できます。追加の引数は、マクロ交換リストにおいて __VA_ARGS__ という名前で参照できる、コンマを含んだ単一文字列にまとめられます。次の例は、変更可能な引数リストマクロの使い方を示しています。


#define debug(...) fprintf(stderr, __VA_ARGS__)
#define showlist(...) puts(#__VA_ARGS__)
#define report(test, ...) ((test)?puts(#test):\
                        printf(__VA_ARGS__))
debug(“Flag”);
debug(“X = %d\n”,x);
showlist(The first, second, and third items.);
report(x>y, “x is %d but y is %d”, x, y);

この結果は、次のようになります。


fprintf(stderr, “Flag”);
fprintf(stderr, “X = %d\n”, x);
puts(“The first, second, and third items.”);
((x>y)?puts(“x>y”):printf(“x is %d but y is %d”, x, y));

2.5.3 事前に定義されている名前

付録の表 A–2 は、事前に定義されているマクロを示しています。これらの値は、#ifdef のようなプリプロセッサに対する条件式の中で使用できます。+p オプションを指定すると、sununixsparc、および i386 の事前定義マクロは自動的に定義されません。

2.5.4 #error

#error 指令は、警告生成後にコンパイルを続行しなくなりました。以前の #error 指令は、警告を生成してコンパイルを続行していました。新しい #error では、ほかのコンパイラとの整合性が確保され、エラーメッセージを生成してコンパイルをすぐに停止するようになりました。コンパイラは終了して障害をレポートします。

2.6 メモリー条件

コンパイルに必要なメモリー量は、次の要素によって異なります。

SPARC プラットフォームでメモリーが足りなくなると、オプティマイザは最適化レベルを下げて現在の手続きを実行することでメモリー不足を補おうとします。それ以後のルーチンについては、コマンド行の -xOlevel オプションで指定した元のレベルに戻ります。

1 つのファイルに多数のルーチンが入っている場合、それをコンパイルすると、メモリーやスワップ領域が足りなくなることがあります。最適化のレベルを下げてみてください。代わりに、最大のプロシージャを、個別のファイルに分割してください。

2.6.1 スワップ領域のサイズ

現在のスワップ領域は swap -s コマンドで表示できます。詳細は、swap(1M) のマニュアルページを参照してください。

swap コマンドを使った例を次に示します。


example% swap -s
total: 40236k bytes allocated + 7280k reserved = 47516k used, 1058708k available

2.6.2 スワップ領域の増加

ワークステーションのスワップ領域を増やすには、mkfile(1M) と swap(1M) コマンドを使用します。そのためには、スーパーユーザーである必要があります。mkfile コマンドは特定サイズのファイルを作成し、swap -a はこのファイルをシステムのスワップ領域に追加します。


 example# mkfile -v 90m /home/swapfile
 /home/swapfile 94317840 bytes
 example# /usr/sbin/swap -a  /home/swapfile

2.6.3 仮想メモリーの制御

1 つの手続きが数千行からなるような非常に大きなルーチンを -xO3 以上でコンパイルすると、大容量のメモリーが必要になることがあります。このようなときには、システムのパフォーマンスが低下します。これを制御するには、1 つのプロセスで使用できる仮想メモリーの量を制限します。

sh シェルで仮想メモリーを制限するには、ulimit コマンドを使用します。詳細は、sh(1) のマニュアルページを参照してください。

次の例では、仮想メモリーを 4G バイトに制限しています。


 example$ ulimit -d 4000000

csh シェルで仮想メモリーを制限するには、limit コマンドを使用します。 詳細は、csh(1) のマニュアルページを参照してください。

次の例でも、仮想メモリーを 4G バイトに制限しています。


 example% limit datasize 4G

どちらの例でも、オプティマイザは データ空間が 4G バイトになった時点でメモリー不足が発生しないような手段をとります。

仮想メモリーの限度は、システムの合計スワップ領域の範囲内です。さらに実際は、大きなコンパイルが行われているときにシステムが正常に動作できるだけの小さい値である必要があります。

スワップ領域の半分以上がコンパイルによって使用されることがないようにしてください。

8G バイトのスワップ領域のあるマシンでは、次のコマンドを使用します。

sh シェルの場合


example$ ulimit -d 4000000

csh の場合


example% limit datasize 4G

最適な設定は、必要な最適化レベルと使用可能な実メモリーと仮想メモリーの量によって異なります。

2.6.4 メモリー条件

ワークステーションには、少なくとも 1G バイトのメモリーを実装するべきです。2G バイトをお勧めします。要件の詳細は、製品リリースの Readme (http://developers.sun.com/sunstudio/documentation/ ) を参照してください。

2.7 C++ オブジェクトに対する strip コマンドの使用

Unix の strip コマンドは、C++ のオブジェクトファイルに対して使用すべきではありません。それらのオブジェクトファイルが使用不可能になることがあります。

2.8 コマンドの簡略化

CCFLAGS 環境変数で特別なシェル別名を定義するか make を使用すれば、複雑なコンパイラコマンドを簡略化できます。

2.8.1 C シェルでの別名の使用

次の例では、頻繁に使用するオプションをコマンドの別名として定義します。


example% alias CCfx "CC -fast -xnolibmil"

次に、この別名 CCfx を使用します。


example% CCfx any.C

前述のコマンド CCfx は、次のコマンドを実行するのと同じことです。


example% CC -fast -xnolibmil any.C

2.8.2 CCFLAGS によるコンパイルオプションの指定

CCFLAGS 環境変数を設定すると、一度に特定のオプションを指定できます。

CCFLAGS 変数は、コマンド行に明示的に指定できます。次の例は、CCFLAGS の設定方法を示したものです (C シェル)。


 example% setenv CCFLAGS ’-xO2 -m64’

次の例では、CCFLAGS を明示的に使用しています。


 example% CC $CCFLAGS any.cc

make を使用する場合、CCFLAGS 変数が前述の例のように設定され、メイクファイルのコンパイル規則が暗黙的に使用された状態で make を呼び出すと、次と同じコンパイルが行われます。

CC -xO2 -m64 files...

2.8.3 make の使用

make ユーティリティーは、Sun のすべてのコンパイラで簡単に使用できる非常に強力なプログラム開発ツールです。詳細については make(1S) のマニュアルページを参照してください。

2.8.3.1 make での CCFLAGS の使用

メイクファイルの暗黙のコンパイラ規則を使用する、つまり、C++ コンパイルがない場合は、make プログラムによって CCFLAGS が自動的に使用されます。

第 3 章 C++ コンパイラオプションの使い方

この章では、コマンド行 C++ コンパイラオプションの使用方法について説明してから、機能別にその使用方法を要約します。オプションの詳細な説明は、「A.2 オプションの一覧」を参照してください。

3.1 構文

次の表は、一般的なオプション構文の形式の例です。

表 3–1 オプション構文形式の例

構文形式 

例 

-option

-E

-optionvalue

-Ipathname

-option=value

-xunroll=4

-option value

-o filename

括弧、中括弧、角括弧、パイプ文字、および省略符号は、オプションの説明で使用されているメタキャラクタです。これらは、オプションの一部ではありません。使用法の構文に関する詳細な説明は、「はじめに」の表記規則を参照してください。

3.2 一般的な注意事項

C++ コンパイラのオプションを使用する際の一般的な注意事項は次のとおりです。

ソースファイル、オブジェクトファイル、ライブラリは、コマンド行に指定された順序でコンパイルおよびリンクされます。

3.3 機能別に見たオプションの要約

この節には、参照しやすいように、コンパイラオプションが機能別に分類されています。各オプションの詳細は、付録 A C++ コンパイラオプションを参照してください。

これらのオプションは、特に記載がないかぎりすべてのプラットフォームに適用されます。Solaris SPARC システム版のオペレーティングシステムに特有の機能は SPARC として表記され、x86 システム版のオペレーティングシステムに特有の機能は x86 として表記されます。

3.3.1 コード生成オプション

表 3–2 コード生成オプション

オプション 

処理  

-compat

コンパイラの主要リリースとの互換モードを設定します。 

+e{0|1}

仮想テーブル生成を制御します。 

-g

デバッグ用にコンパルします。 

-KPIC

位置に依存しないコードを生成します。 

-Kpic

位置に依存しないコードを生成します。 

-mt

マルチスレッド化したコードのコンパイルとリンクを行います。 

-xaddr32

コードを 32 ビットアドレス空間に制限します (x86/x64)。 

-xarch

ターゲットアーキテクチャーを指定します。 

-xcode=a

(SPARC) コードのアドレス空間を指定します。 

-Merge

(SPARC) データセグメントとテキストセグメントをマージします。 

-xtarget

ターゲットシステムを指定します。 

–xmodel

64 ビットオブジェクトの形式を Solaris x86 プラットフォーム用に変更します。 

+w

意図しない結果が生じる可能性のあるコードを特定します。 

+w2

+w で生成される警告以外に、通常は問題がなくても、プログラムの移植性を低下させる可能性がある技術的な違反についての警告も生成します。

-xregs

コンパイラは、一時記憶領域として使用できるレジスタ (一時レジスタ) が多ければ、それだけ高速なコードを生成します。このオプションは、利用できる一時レジスタを増やしますが、必ずしもそれが適切であるとはかぎりません。 

-z arg

リンカーオプション 

3.3.2 コンパイル時パフォーマンスオプション

表 3–3 コンパイル時パフォーマンスオプション

オプション 

処理  

-instlib

指定ライブラリにすでに存在しているテンプレートインスタンスの生成を禁止します。 

-m32|-m64

コンパイルされたバイナリオブジェクトのメモリーモデルを指定します。 

-xinstrument

スレッドアナライザで分析するために、プログラムをコンパイルして計測します。 

-xjobs

コンパイラが処理を行うために作成するプロセスの数を設定します。 

-xpch

共通の一連のインクルードファイル群を共有するソースファイルを持つアプリケーションのコンパイル時間を短縮できます。 

-xpchstop

-xpch でプリコンパイル済みヘッダーファイルを作成する際に適用される、最後のインクルードファイルを指定します。

-xprofile_ircache

(SPARC) -xprofile=collect で保存されたコンパイルデータを再使用します。

-xprofile_pathmap

(SPARC) 1 つのプロファイルディレクトリに存在する複数のプログラムや共有ライブラリをサポートします。 

3.3.3 コンパイル時とリンク時のオプション

次の表は、リンク時とコンパイル時の両方に指定する必要があるオプションをまとめています。

表 3–4 コンパイル時とリンク時のオプション

オプション  

処理  

-fast

実行可能コードの速度を向上させるコンパイルオプションの組み合わせを選択します。

-m32|-m64

コンパイルされたバイナリオブジェクトのメモリーモデルを指定します。 

-mt

マクロオプションです。

-xarch

命令セットアーキテクチャーを指定します。

-xautopar

複数プロセッサ用の自動並列化を有効にします。

-xhwcprof

(SPARC) コンパイラのハードウェアカウンタによるプロファイリングのサポートを有効にします。

-xipo

内部手続き解析パスを呼び出すことにより、プログラム全体の最適化を実行します。

-xlinkopt

再配置可能なオブジェクトファイルのリンク時の最適化を実行します。

-xmemalign

(SPARC) 想定するメモリー境界整列の最大値と、境界整列に失敗したデータがアクセスされた際の動作を指定します。

-xopenmp

明示的な並列化のための OpenMP インタフェースをサポートする。このインタフェースには、ソースコード指令セット、実行時ライブラリルーチン、環境変数などが含まれます。

-xpagesize

スタックとヒープ用の優先ページサイズを設定します。

-xpagesize_heap

ヒープ用の優先ページサイズを設定します。

-xpagesize_stack

ヒープ用の優先ページサイズを設定します。

-xpg

gprof(1) によるプロファイルの準備として、データを収集するためのオブジェクトコードを生成します。

-xprofile

プロファイルのデータを収集、または最適化のためにプロファイルを使用します。

-xvector

ベクトルライブラリ関数を自動的に呼び出すようにします。

3.3.4 デバッグオプション

表 3–5 デバッグオプション

オプション  

処理  

+d

C++ インライン関数を展開しません。 

-dryrun

ドライバがコンパイラに渡すオプションを表示しますが、コンパイルはしません。 

-E

C++ ソースファイルにプリプロセッサを実行し、結果を stdout に出力しますが、コンパイルはしません。

-g

デバッグ用にコンパルします。 

-g0

デバッグ用にコンパイルしますが、インライン機能は無効にしません。 

-H

インクルードされるファイルのパス名を出力します。 

-keeptmp

コンパイル中に作成されたすべての一時ファイルを残します。 

-migration

以前のコンパイラからの移行に関する情報の参照先を表示します。 

-P

ソースの前処理だけを行い、.i ファイルに出力します。

-Qoption

オプションをコンパイル中の各処理に直接渡します。 

-readme

README ファイルの内容を表示します。

-s

実行可能ファイルからシンボルテーブルを取り除きます。 

-temp=dir

一時ファイルのディレクトリを指定します。 

-verbose=vlst

コンパイラの冗長性を制御します。 

-xcheck

スタックオーバーフローの実行時検査を追加します。 

-xdumpmacros

定義内容、定義および解除された位置、使用されている場所に関する情報を出力します。 

-xe

構文と意味のエラーのチェックだけを行います。 

-xhelp=flags

コンパイラオプションの要約を一覧表示します。 

-xport64

32 ビットアーキテクチャーから 64 ビットアーキテクチャーへの移植中の一般障害について警告します。 

3.3.5 浮動小数点オプション

表 3–6 浮動小数点オプション

オプション 

処理 

-fma

(SPARC) 浮動小数点の積和演算 (FMA) 命令の自動生成を有 効にします。 

-fns[={no|yes}]

(SPARC) SPARC 非標準浮動小数点モードを有効または無効にします。 

-fprecision=p

x86: 浮動小数点精度モードを設定します。

-fround=r

起動時に IEEE 丸めモードを有効にします。 

-fsimple=n

浮動小数点最適化の設定を行います。 

-fstore

x86: 浮動小数点式の精度を強制的に使用します。

-ftrap=tlst

起動時に IEEE トラップモードを有効にします。 

-nofstore

x86: 強制された式の精度を無効にします。

-xlibmieee

例外時に libm が数学ルーチンに対し IEEE 754 値を返します。

3.3.6 言語オプション

表 3–7 言語オプション

オプション 

処理 

-compat

コンパイラの主要リリースとの互換モードを設定します。 

-features=alst

C++ の各機能を有効化または無効化します。 

-xchar

文字型が符号なしと定義されているシステムからのコードの移行を容易に行えるようにします。 

-xldscope

共有ライブラリをより速くより安全に作成するため、変数と関数の定義のデフォルトリンカースコープを制御します。 

-xthreadvar

(SPARC) デフォルトのスレッドローカルな記憶装置へのアクセスモードを変更します。 

-xtrigraphs

文字表記シーケンスを認識します。 

-xustr

16 ビット文字で構成された文字リテラルを認識します。 

3.3.7 ライブラリオプション

表 3–8 ライブラリオプション

オプション 

処理 

-Bbinding

ライブラリのリンク形式を、シンボリック、動的、静的のいずれかから指定します。 

-d{y|n}

実行可能ファイル全体に対して動的ライブラリを使用できるかどうか指定します。 

-G

実行可能ファイルではなく動的共有ライブラリを構築します。 

-hname

生成される動的共有ライブラリに内部名を割り当てます。 

-i

ld(1) がどのような LD_LIBRARY_PATH 設定も無視します。

-Ldir

dir に指定したディレクトリを、ライブラリの検索に使用するディレクトリとして追加します。

-llib

リンカーのライブラリ検索リストに liblib.a または liblib.so を追加します。

-library=llst

特定のライブラリとそれに対応するファイルをコンパイルとリンクに強制的に組み込みます。 

-mt

マルチスレッド化したコードのコンパイルとリンクを行います。 

-norunpath

ライブラリのパスを実行可能ファイルに組み込みません。 

-Rplst

動的ライブラリの検索パスを実行可能ファイルに組み込みます。 

-staticlib=llst

静的にリンクする C++ ライブラリを指定します。 

-xar

アーカイブライブラリを作成します。 

-xbuiltin[=opt]

標準ライブラリ呼び出しの最適化を有効または無効にします。 

-xia

(Solaris) 適切な区間演算ライブラリをリンクし、浮動小数点環境を設定します。 

-xlang=l[,l]

該当する実行時ライブラリをインクルードし、指定された言語に適切な実行時環境を用意します。 

-xlibmieee

例外時に libm が数学ルーチンに対し IEEE 754 値を返します。

-xlibmil

最適化のために、選択された libm ライブラリルーチンをインライン展開します。

-xlibmopt

最適化された数学ルーチンのライブラリを使用します。 

-xnolib

デフォルトのシステムライブラリとのリンクを無効にします。 

-xnolibmil

コマンド行の -xlibmil を取り消します。

-xnolibmopt

数学ルーチンのライブラリを使用しません。 

3.3.8 廃止オプション


注 –

次のオプションは、現在は廃止されているためにコンパイラに受け入れられないか、将来のリリースでは削除されます。


表 3–9 廃止オプション

オプション 

処理  

-library=%all

将来のリリースで削除されます。 

-xlic_lib=sunperf

Sun Performance Library にリンクするには、—library=sunperf を使用します。

-xlicinfo

非推奨。 

-noqueue

ライセンス情報のキューイングを行いません。 

-ptr

コンパイラは無視します。将来のリリースのコンパイラがこのオプションを別の意味で使用する可能性もあります。 

-sb、—sbfast、—xsb、—xsbfast

廃止され、メッセージを表示されずに無視されます。 

-vdelx

将来のリリースで削除されます。 

-x386

適切な —xtarget オプションを使用します。

-x486

適切な —xtarget オプションを使用します。

-xcg89

-xtarget=ss2 を使用します。

-xcrossfile

代わりに -xipo を使用してください。

-xnativeconnect

廃止。これに代わるオプションはありません。 

-xprefetch=yes

代わりに - xprefetch=auto,explicit を使用します。

-xprefetch=no

代わりに -xprefetch=no%auto,no%explicit を使用します。

-xvector=yes

代わりに、--xvector=lib を使用します。

-xvector=no

代わりに、--xvector=none を使用します。

3.3.9 出力オプション

表 3–10 出力オプション

オプション 

処理 

-c

コンパイルのみ。オブジェクト (.o) ファイルを作成しますが、リンクはしません。

-dryrun

ドライバからコンパイラに対して発行されたコマンド行を表示しますが、コンパイルを行いません。 

-E

C++ ソースファイルにプリプロセッサを実行し、結果を stdout に出力しますが、コンパイルはしません。

-erroff

コンパイラの警告メッセージを抑止します。 

-errtags

各警告メッセージのメッセージタグを表示します。 

-errwarn

指定の警告メッセージが出力されると、cc はエラーステータスを返して終了します。 

-filt

コンパイラがリンカーエラーメッセージに適用するフィルタリングを抑止します。 

-G

実行可能ファイルではなく動的共有ライブラリを構築します。 

-H

インクルードされるファイルのパス名を出力します。 

-migration

以前のコンパイラからの移行に関する情報の参照先を表示します。 

-o filename

出力ファイルや実行可能ファイルの名前を filename にします。

-P

ソースの前処理だけを行い、.i ファイルに出力します。

-Qproduce sourcetype

CC ドライバに sourcetype (ソースタイプ) 型のソースコードを生成するよう指示します。

-s

実行可能ファイルからシンボルテーブルを取り除きます。 

-verbose=vlst

コンパイラの冗長性を制御します。 

+w

必要に応じて追加の警告を出力します。 

+w2

該当する場合は、より多くの警告を出力します。 

-w

警告メッセージを抑止します。 

-xdumpmacros

定義内容、定義および解除された位置、使用されている場所に関する情報を出力します。 

-xe

ソースファイルの構文と意味のチェックだけを行い、オブジェクトや実行可能コードの出力はしません。 

-xhelp=flags

コンパイラオプションの要約を一覧表示します。 

-xhelp=readme

README ファイルの内容を表示します。

-xM

メイクファイルの依存情報を出力します。 

-xM1

依存情報の生成は行いますが、 

/usr/include の組み込みはしません。

-xtime

コンパイル処理ごとの実行時間を報告します。 

-xwe

すべての警告をエラーに変換します。 

-z arg

リンカーオプション。

3.3.10 実行時パフォーマンスオプション

表 3–11 実行時パフォーマンスオプション

オプション 

処理  

-fast

一部のプログラムで最適な実行速度が得られるコンパイルオプションの組み合わせを選択します。 

-fma

(SPARC) 浮動小数点の積和演算 (FMA) 命令の自動生成を有 効にします。 

-g

パフォーマンスの解析 (およびデバッグ) に備えてプログラムを用意するようにコンパイラとリンカーの両方に指示します。 

-s

実行可能ファイルからシンボルテーブルを取り除きます。 

-m32|-m64

コンパイルされたバイナリオブジェクトのメモリーモデルを指定します。 

-xalias_level

コンパイラで、型に基づく別名の解析および最適化を実行するように指定します。 

-xarch=isa

ターゲットのアーキテクチャー命令セットを指定します。 

-xbinopt

あとで最適化、変換、分析を行うために、バイナリを準備します。 

-xbuiltin[=opt]

標準ライブラリ呼び出しの最適化を有効または無効にします。 

-xcache=c

(SPARC) オプティマイザのターゲットキャッシュプロパティーを定義します。 

-xcg89

汎用の SPARC V7 アーキテクチャー用のコンパイルを行います。 

-xcg92

SPARC V8 アーキテクチャー用のコンパイルを行います。 

-xchip=c

ターゲットのプロセッサチップを指定します。 

-xF

リンカーによる関数と変数の順序変更を有効にします。 

-xinline=flst

どのユーザーが作成したルーチンをオプティマイザでインライン化するかを指定します。 

-xipo

内部手続きの最適化を実行します。 

-xlibmil

最適化のために、選択された libm ライブラリルーチンをインライン展開します。

-xlibmopt

最適化された数学ルーチンライブラリを使用します。 

-xlinkopt

(SPARC) オブジェクトファイル内のあらゆる最適化のほかに、結果として出力される実行可能ファイルや動的ライブラリのリンク時最適化も行います。 

-xmemalign=ab

(SPARC) メモリーの予想される最大境界整列と境界整列していないデータアクセスの動作を指定します。 

-xnolibmil

コマンド行の -xlibmil を取り消します。

-xnolibmopt

数学ルーチンのライブラリを使用しません。 

-xOlevel

最適化レベルを level にします。

-xpagesize

スタックとヒープの優先ページサイズを設定します。 

-xpagesize_heap

ヒープの優先ページサイズを設定します。 

-xpagesize_stack

スタックの優先ページサイズを設定します。 

-xprefetch[=lst]

先読みをサポートするアーキテクチャーで先読み命令を有効にします。 

-xprefetch_level

-xprefetch=auto を設定したときの先読み命令の自動挿入を制御します。

-xprofile

実行時プロファイルデータを使って収集あるいは最適化を実行します。 

-xregs=rlst

一時レジスタの使用を制御します。 

-xsafe=mem

(SPARC) メモリーに関するトラップを起こさないものとします。 

-xspace

(SPARC) コードサイズが大きくなるような最適化は行いません。 

-xtarget=t

ターゲットの命令セットと最適化のシステムを指定します。 

-xthreadvar

デフォルトのスレッドローカル記憶装置アクセスモードを変更します。 

-xunroll=n

可能な場合は、ループを展開します。 

-xvis

(SPARC) VISTM 命令セットに定義されているアセンブリ言語テンプレートをコンパイラが認識します。

3.3.11 プリプロセッサオプション

表 3–12 プリプロセッサオプション

オプション 

処理 

-Dname[=def]

シンボル name をプリプロセッサに定義します。

-E

C++ ソースファイルにプリプロセッサを実行し、結果を stdout に出力しますが、コンパイルはしません。

-H

インクルードされるファイルのパス名を出力します。 

-P

ソースの前処理だけを行い、.i ファイルに出力します。

-Uname

プリプロセッサシンボル name の初期定義を削除します。

-xM

メイクファイルの依存情報を出力します。 

-xM1

依存情報を生成しますが、/usr/include は除きます。

3.3.12 プロファイルオプション

表 3–13 プロファイルオプション

オプション 

処理 

-p

prof でプロファイル処理するためのデータを収集するオブジェクトコードを用意します。

-xa

プロファイル用のコードを生成します。 

-xpg

gprof プロファイラによるプロファイル処理用にコンパイルします。

-xprofile

実行時プロファイルデータを収集したり、このデータを使って最適化します。 

3.3.13 リファレンスオプション

表 3–14 リファレンスオプション

オプション 

処理 

-migration

以前のコンパイラからの移行に関する情報の参照先を表示します。 

-xhelp=flags

コンパイラオプションの要約を一覧表示します。 

-xhelp=readme

README ファイルの内容を表示します。

3.3.14 ソースオプション

表 3–15 ソースオプション

オプション 

処理 

-H

インクルードされるファイルのパス名を出力します。 

-Ipathname

include ファイル検索パスに pathname を追加します。

-I-

インクルードファイル検索規則を変更します。 

-xM

メイクファイルの依存情報を出力します。 

-xM1

依存情報を生成しますが、/usr/include は除きます。

3.3.15 テンプレートオプション

表 3–16 テンプレートオプション

オプション 

処理 

-instances=a

テンプレートインスタンスの位置とリンケージを制御します。 

-template=wlst

さまざまなテンプレートオプションを有効または無効にします。 

3.3.16 スレッドオプション

表 3–17 スレッドオプション

オプション  

処理  

-mt

マルチスレッド化したコードのコンパイルとリンクを行います。 

-xsafe=mem

(SPARC) メモリーに関するトラップを起こさないものとします。 

-xthreadvar

(SPARC) デフォルトのスレッドローカルな記憶装置へのアクセスモードを変更します。