c - 将来 - swift programming



本当にlibgccが必要ですか? (1)

私はMac OS X 10.6でGCC 4.6.2を使っています。 私はコンパイル時に-static-libgccオプションを使用します。そうでなければ私のバイナリはシステム上でlibgccを探します、そしてGCC 4.2以上がOS Xでサポートされているかどうかわからない。 私はそれについて読みました、そしてGNUドキュメントはそれが「ターゲットプロセッサが直接実行することができない算術演算」を含むと言います。 これらの操作がどのようにしてわかりますか。 そして、なぜそれらが非常に複雑なのでこのライブラリを含める必要があるのでしょうか。 GCCがこれらのライブラリ関数に頼らずに直接コードを直接最適化できないのはなぜですか。 私は少し混乱しています。 これについてのどんな洞察力も感謝されるでしょう!


はい、あなたはそれを必要とします....おそらく。 あなたがそれを必要としないならば、それから静的にリンクすることは無害です。 あなたがそれを必要としているかどうかは、 -t link traceオプションを使うことで-tます(私は思います)。

1つの命令でできないことがいろいろあります(通常は32ビットアーキテクチャでの64ビット操作など)。 これらのことは可能ですが、それらが自明ではない数の命令を使用する場合は、それらすべてを1つの場所に配置する方がスペース効率がよくなります。

-O0を使用して最適化を無効にすると(これは実際にはデフォルトです)、GCCはほとんどの場合libgccルーチンを使用します。

速度最適化を有効にすると、GCCは命令シーケンスをコードに直接挿入することを選択できます(方法がわかっている場合)。 あなたはそれがlibgccバージョンのどれも使わないことに終わるかもしれません - それは確かにより少ないlibgcc呼び出しを使うでしょう。

サイズの最適化を有効にすると、GCCは関数呼び出しを優先するかもしれませんし、そうでないかもしれません - それはGCC開発者がそれぞれの場合に最高の速度とサイズのトレードオフであると考えるものによって異なります。 速度を最適化するように指示しても、コンパイラはいくつかの関数は使用される可能性が低いと判断し、サイズを最適化する可能性があります。PGOを使用する場合はなおさらです。

基本的に、 memcpyや数学ライブラリ関数と同じように考えることができます。コンパイラは、有益であると判断した関数をインライン化し、それ以外の場合はライブラリ関数を呼び出します。 コンパイラは、ライブラリ定義を見なくても、標準関数とlibgcc関数を「インライン化」できます。もちろん、それらが何をするのかを「知っている」だけです。

静的または動的libgccを使用するかどうかは、興味深いトレードオフです。 一方では、動的(共有)ライブラリはシステム全体で使用するメモリが少なくなり、キャッシュされる可能性が高くなります。一方、静的libgccは呼び出しオーバーヘッドが少なくなります。

しかし最も重要なことは互換性です。 プログラムを実行するには、明らかにlibgccライブラリが存在しなければなりませんが、互換性のあるバージョンでなければなりません。 安定したGCCバージョンのLinuxディストリビューションで大丈夫ですが、それ以外の場合は静的リンクの方が安全です。

あなたの質問に答えられることを願っています。





gcc