如何在Linux上内联string.h函数?

发布于 2024-10-20 18:01:37 字数 903 浏览 1 评论 0原文

我想优化一些代码,以便 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
*/

I want to optimize some code such that all the functions in string.h will be inlined. I'm on x86_64.

I've tried -O3, -minline-all-stringops and when I do "nm a.out" it shows it is calling the glibc version.

Checking with gcc -S, I see the calls.

What am I missing? There are dozens of #ifdef _SOME_SETTING_ in string.h, and bits/string3.h shows the inline version, but I don't know how to get there.

for example:

$ 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
*/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

源来凯始玺欢你 2024-10-27 18:01:37

如果函数实现不在头文件和单独的编译单元中,则无法内联它,除非您有可以执行 LTCG 的编译器。

听起来您需要自己编写实现。

If a function implementation is not in the header file and in a separate compilation unit, it cannot be inlined unless you have a compiler that can do LTCG.

Sounds like you'll need to write the implementation yourself.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文