「gcc」の版間の差分
細 |
|||
行2: | 行2: | ||
*http://gcc.gnu.org/ | *http://gcc.gnu.org/ | ||
+ | |||
+ | なお、Apple は将来的には gcc を [[clang]] に変える方向にある。 | ||
== 入手先 == | == 入手先 == |
2013年9月15日 (日) 13:11時点における最新版
MacOSX の DeveloperToolsにも付属している、フリーの高性能 C/C++/Objective-C/Fortran/... コンパイラ。
なお、Apple は将来的には gcc を clang に変える方向にある。
入手先[編集]
下記からも gcc および llvm-gcc などを含む一式を入手できる。Mac OSX 10.7 (Lion) (Xcode 4.2以降)で llvm-gcc-4.2 のみとなったが、gcc-4.2 を動かしたい際に、入手に便利。
インストール後は
$ ls -l `which CC` `which gcc` `which gcc-4.2` lrwxr-xr-x 1 root wheel 5 5 23 18:39 /usr/bin/CC -> clang lrwxr-xr-x 1 root wheel 12 5 23 18:39 /usr/bin/gcc -> llvm-gcc-4.2 -rwxr-xr-x 1 root wheel 113024 5 16 2011 /usr/bin/gcc-4.2 $ gcc-4.2 -v gcc version 4.2.1 (Apple Inc. build 5666) (dot 3)
なおこのgcc-4.2 (apple-gcc42) のソースコードは,
また、Homebrewを使ってもインストールできる
$ brew tap homebrew/dupes $ brew install apple-gcc42 $ brew untap homebrew/dupes
最適化オプション[編集]
PPC 機でコンパイル時に -fast というオプションをつけると、 バイナリファイルが G5 向けに最適化されます。
また、G4, G5 向けに最適化する場合は -fast -mcpu=7450 として下さい。 ただし、このオプションで作られたバイナリは、初期の G4プロセッサ(PowerPC 7410等)では動作しませんので注意して下さい。
- G3: -mcpu=750
- 初期の G4: -mcpu=7400
- 第二世代の G4: -mcpu=7450
- G5: -mcpu=G5
最適化オプションについての詳細は、mac gcc を参照して下さい。
4倍精度計算[編集]
Xcode1.5-gcc3.3.2 では4倍精度計算をしようとすると
warning: use of `long double' type; its size may change in a future release
と警告されていた。
- Tiger (10.4.5, gcc version 4.0.1 (Apple Computer, Inc. build 5247))では G5 で4倍精度計算が可能になった。
- G4, G3 でも可能です。
$ cat testQuadPrec.c #include <stdio.h> #include <math.h> int main() { double x; long double y; x = 1.0/3.0; y = 1.0l/3.0l; printf("x %2d %32.31f\n", sizeof(x),x); printf("y %2d %32.31Lf\n", sizeof(y),y); x = 0.33333333333333333333333333333333333333; y = 0.33333333333333333333333333333333333333L; printf("x %2d %32.31f\n", sizeof(x),x); printf("y %2d %32.31Lf\n", sizeof(y),y); printf("pi %32.31f\n", 4.0*atan(1.0)); printf("pi %32.31Lf\n", 4.0*atanl(1.0)); return 0; }
$ gcc -O3 testQuadPrec.c $ ./a.out x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333333333333333 x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333333333333333 pi 3.1415926535897931159979634685442 pi 3.1415926535897932384626433832795
- IEEE 規格によりますと有効精度が 80 bit -- 128 bit(?) であれば4倍精度浮動小数点数(?)と称しても良いようです。
- どうやら、本当は、拡張倍精度(extended double or long double precision, 80 bit以上) と4倍精度(quadruple precision, 128 bit)を区別して考える必要があるようです。
- そして、Intel Mac (IntelCore) においては、有効精度が 80 bit のlong double計算をCPUネイティブにサポートするようです。
- このCPUでサポートされている80 bit精度なlong doubleについて議論している資料を見つけました。これの p. 62 or later です: http://www.cs.berkeley.edu/~wkahan/JAVAhurt.pdf ほかにもこれです:http://www.cs.berkeley.edu/~wkahan/ARITH_17.pdf
- しかし 128 bit の4倍精度を欲しい人はソフトウェア(コンパイラ?)で実現する必要があるようです。
- Intel Mac (10.4.5, gcc version 4.0.1 (Apple Computer, Inc. build 5250)) でのテスト結果。以下を見る限り、四則演算と代入で 16 byte 分の精度が確保されていないようです。
$ cc -O3 -march=i686 -mtune=pentium-m -m128bit-long-double testQuadPrec.c $ ./a.out x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333423683514374 x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333423683514374 pi 3.1415926535897931159979634685442 pi 3.1415926535897932385128089594062
$ cc -O3 -march=i686 -mtune=pentium-m testQuadPrec.c $ ./a.out x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333423683514374 x 8 0.3333333333333333148296162562474 y 16 0.3333333333333333333423683514374 pi 3.1415926535897931159979634685442 pi 3.1415926535897932385128089594062
$ cc -O3 -march=i686 -mtune=pentium-m -m96bit-long-double testQuadPrec.c $ ./a.out x 8 0.3333333333333333148296162562474 y 12 0.3333333333333333333423683514374 x 8 0.3333333333333333148296162562474 y 12 0.3333333333333333333423683514374 pi 3.1415926535897931159979634685442 pi 3.1415926535897932385128089594062
変数のサイズ[編集]
各変数型のサイズを知るには、安直に:
#include <stdio.h> int main( int argc, char* argv[] ) { printf( "%d %d", sizeof(int), sizeof(double) ); return 0; }
gccのオプション[編集]
- 知っていると便利な gcc のオプション
http://mail.unixuser.org/~euske/doc/gccopts/index.html http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
例:c89準拠としてコンパイル
$ gcc -ansi -pedantic -fstrict-aliasing -Wall -Wextra -Wmissing-declarations test.c
プロトタイプ必須とするにはさらにオプションを加える
-Wstrict-prototypes -Wmissing-prototypes
(上記では低レベルのミスを見逃さないように警告オプションをつけています.パーフェクトではありません.)
gccの乱数出力[編集]
Mountain Lion, Apple gcc (Xcode 4.6.3) では次のコードが同じような値を出力し続ける。
#include <stdio.h> #include <time.h> #include <stdlib.h> int main() { double r1; srand((unsigned) time(NULL)); r1 = (0.0+rand())/RAND_MAX; printf( "%lf\n", r1 ); return 0; }
Snow Leopard(Xcode 3.2.6)では場合により動作する(K.T. さん情報提供)
- (0.0 + rand())/RAND_MAX --> strange
- (0.0 + rand())/(double)RAND_MAX --> OK
- (double)rand()/(double)RAND_MAX --> OK
- (double)rand()/RAND_MAX --> OK