4

string.h 内のすべての関数がインライン化されるように、いくつかのコードを最適化したいと考えています。私は x86_64 を使用しています。

-O3、-minline-all-stringops を試しましたが、「nm a.out」を実行すると、glibc バージョンを呼び出していることが示されます。

gcc -S で確認すると、呼び出しが表示されます。

私は何が欠けていますか?string.h には数十の #ifdef _SOME_SETTING_ があり、bits/string3.h はインライン バージョンを示していますが、そこに到達する方法がわかりません。

例えば:

$ cat test.c
#include <string.h>

main() {
    char *a, *b;
    strcpy(b,a);
}
/*

When compiled with:

gcc -minline-all-stringops -O6 -I. -S -o test.S test.c

Produces:

    .file   "test.c"
    .text
    .p2align 4,,15
.globl main
    .type   main, @function
main:
.LFB12:
    .cfi_startproc
    subq    $8, %rsp
    .cfi_def_cfa_offset 16
    xorl    %esi, %esi
    xorl    %edi, %edi
    call    strcpy
    addq    $8, %rsp
    .cfi_def_cfa_offset 8
    ret
    .cfi_endproc
.LFE12:
    .size   main, .-main
    .ident  "GCC: (GNU) 4.5.1 20100924 (Red Hat 4.5.1-4)"
    .section    .note.GNU-stack,"",@progbits
*/
4

1 に答える 1

1

関数の実装がヘッダー ファイルと別のコンパイル ユニットにない場合、LTCG を実行できるコンパイラがない限りインライン化できません。

実装を自分で書く必要があるようです。

于 2011-03-03T23:07:43.430 に答える