【问题标题】:Force clang to inline or use static call to `memmove()`强制clang内联或使用静态调用`memmove()`
【发布时间】:2021-11-10 03:21:37
【问题描述】:

以下问题听起来确实像 XY 问题,但相信我,它不是。这与this问题中进行的冗长调查有关。

我有充分的理由相信该问题的解决方案(不是针对那里的最小示例,而是针对我的实际代码)涉及确保memmove() 不是通过共享库调用,而是作为静态调用, 直接从我的代码到 memmove() 而不通过 PLT,或者如果 memmove() 的代码内联在我的代码中,甚至更好。

但是,我找不到命令行开关或其他任何东西来防止动态调用memmove()(注意动态调用是通过反汇编输出来确认的,在使用-O3 构建之后。)开关存在吗?虽然我可以为我的平台获取一些优化的memmove() 代码(例如this),但我宁愿避免引入一些可能会在未来架构中被淘汰的代码,而且我也不认为这是一种好的编程实践。

我在 Raspberry Pi 4 上使用带有版本字符串 Ubuntu clang version 12.0.0-3ubuntu1~21.04.1 的 clang。uname -a 的输出是 Linux rpi4 5.11.0-1017-raspi #18-Ubuntu SMP PREEMPT Mon Aug 23 07:34:31 UTC 2021 aarch64 aarch64 aarch64 GNU/Linux

【问题讨论】:

  • 不是您真正想要的,但this answer 末尾的脚注可能会引起您的兴趣。

标签: c clang shared-libraries dynamic-linking


【解决方案1】:

虽然我可以为我的平台获取一些优化的 memmove() 代码(例如这个),但我宁愿避免引入一些可能在未来架构中被淘汰的代码

最好的办法是编写一个直接的 inline CC++ 实现 memmove,并依赖编译器对其进行内联和优化。

令人惊讶的是,这样做通常比手工编码的汇编实现要好,因为编译器通常可以判断这些区域是不重叠的,或者正在使用 64 位字的整数倍数,因此通用 @ 的各个部分987654325@可以优化出来。

CC++ 中执行此操作可确保它将继续在未来的架构上工作(只要您可以为它们编译)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    相关资源
    最近更新 更多