3

strictモードで実行している場合、 GCCは多くのビルトインを無効に-std=c...します。

厳密なISOCモード(-ansi、-std = c90、-std=c99または-std=c11)以外では、関数_exit、alloca、bcmp、bzero ... stpcpy、...は組み込み関数として処理できます。 。これらの関数にはすべて、対応するバージョンの前に_が組み込まれています。これは、厳密なC90モードでも使用できます。

その理由はありますか?ビルトインは準拠していませんか?それとも、標準では、呼び出すときmemcpyに実際に呼び出す必要があり、最適化できないと規定されているためですか?

を使用して再コンパイルすると-std=gnu*、さらに最適化が可能になるため、コードを確実に高速に実行できるようになります。

GCCは通常、特定の組み込み関数をより効率的に処理するための特別なコードを生成します。たとえば、allocaの呼び出しは、スタックを直接調整する単一の命令になる場合があり、memcpyの呼び出しは、インラインコピーループになる場合があります。

4

1 に答える 1

4

、、、、、またはそのリスト_exitallocaの他bcmpの関数bzerostpcpyいずれもC標準で定義されていないため、準拠するCコンパイラで定義しないでください。これらの名前は、ユーザーが独自の識別子として使用できる必要があります。

他の多くのビルトインは、厳密なISOモードでも有効になっていることに注意してください。たとえば、memcpy「指定されていない限り、[a]組み込み[関数]として認識され-fno-builtinます」

于 2012-05-20T19:55:09.307 に答える