当 __builtin_memcpy 替换为 libc 的 memcpy 时

2024-02-10

有一个C99/posix版本memcpy海湾合作委员会的功能:__builtin_memcpy.

有时它可以被 GCC 替换为 memcpy 的内联版本,而在其他情况下它可以通过调用 libc 的 memcpy 来替换。例如。有人指出here http://lwn.net/Articles/29183/:

最后,在编译器注释中, __builtin_memcpy 可以回退到发出 memcpy 函数调用。

这个选择的逻辑是什么?其他兼容 gcc 的编译器(如 clang/llvm、intel c++ 编译器、PCC、suncc (oracle studio))中的逻辑是否相同?

什么时候我应该更喜欢使用 __builtin_memcpy 而不是普通的 memcpy?


我前一段时间一直在尝试内置替换,我发现<string.h>仅当源参数的大小在编译时已知时,函数才会被替换。在这种情况下,调用libc直接被展开的代码替换。

除非你编译-fno-builtin, -ansi, -std=c89或类似的东西,实际上你是否使用并不重要__builtin_是否有前缀。

尽管很难理解,但决定是否发出库调用或代码块的代码似乎是here http://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/expr.c;h=7e909bc0f5c8035cfe17f643cbad826c2d41cd6c;hb=9bcca88e24e64d4e23636aafa3404088b13bcb0e#l1102.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 __builtin_memcpy 替换为 libc 的 memcpy 时 的相关文章

  • 如何使用 GCC 在 C 上编译库?

    我用这些文件创建了一个库pila h and pila c 我编译文件pila c with gcc pila c c这个库运行良好 我已经测试过了 然后我又做了一个图书馆 这个库有文件pila funciones extra h and
  • gcc 的 -Wbad-function-cast 的目的是什么?

    根据此处答案的建议 我打开了 Wbad function cast看看我的代码是否有 gcc 可以捕获的任何不良行为 结果出现了这个示例 unsigned long n int crossover int pow n 14 这里并不重要cr
  • gcc 内部使用相同的位表示 int 和 char 吗?

    我只是为了好玩而玩弄 unicode 字符 不使用 wchar t 支持 我只使用常规的 char 数据类型 我注意到 当以十六进制打印它们时 它们显示了完整的 4 个字节 而不是仅一个字节 对于前 考虑这个 c 文件 include
  • 内联 asm 中不支持的指令“mov”将控制寄存器移动到 uint32_t

    我在 C 函数中使用汇编代码 但海湾合作委员会给出unsupported instruction mov 以下代码的错误 uint32 t faulting address asm volatile mov cr2 0 r faulting
  • GCC 4.7 字符串文字的源字符编码和执行字符编码?

    Linux x86 64 上的 GCC 4 7 是否具有默认字符编码 用于验证和解码 C 源文件中字符串文字的内容 这是可配置的吗 此外 当将字符串数据从字符串文字链接到输出的数据部分时 它是否具有默认的执行字符编码 这是可配置的吗 在任何
  • 如何BSWAP 64位寄存器的低32位?

    我一直在寻找如何将 BSWAP 用于 64 位寄存器的低 32 位子寄存器的答案 例如 0x0123456789abcdef位于 RAX 寄存器内 我想将其更改为0x01234567efcdab89用一条指令 因为性能 所以我尝试了以下内联
  • 使用 AVX 内在函数代替 SSE 并不能提高速度 - 为什么?

    我已经使用 Intel 的 SSE 内在函数相当长一段时间了 并取得了良好的性能提升 因此 我希望 AVX 内在函数能够进一步加速我的程序 不幸的是 直到现在情况并非如此 可能我犯了一个愚蠢的错误 所以如果有人能帮助我 我将非常感激 我使用
  • C 中类似函数的宏定义

    我想定义一个像 MACRO 这样的函数 IE define foo x if x gt 32 x else 2 x endif 那是 if x gt 32 then foo x present x else foo x present 2
  • 软件预取手动指令合理的场景

    我读过有关 x86 和 x86 64 Intel 的内容gcc提供特殊的预取指令 include
  • 用更有意义的文本替换 GCC 输出中的 a-hats [重复]

    这个问题在这里已经有答案了 可能的重复 为什么 gcc 的所有错误消息中都有 https stackoverflow com questions 547071 why does gcc have a in all its error mes
  • 在 Ubuntu 上用 C 项目编译和链接 GTK 3

    我相信这不是重复的问题 在发布此问题之前我已经看过所有问题 答案 我想我这里的情况有所不同 我使用Ubuntu 12 04并下载GTK 2 和 3 我从 GNOME 网站复制了一个简单的 GTK 源代码 但是当我在终端中使用这个命令时 gc
  • `printf()` 中格式说明符“%qd”的用途是什么?

    我看到格式说明符 qd浏览时github https github com Microsoft clang blob master test Sema format strings c代码 然后我检查了 GCC 编译器 它工作正常 incl
  • 分析 ELF 部分和符号大小的工具

    我需要一种方法来分析 ARM 的 GCC 编译器的输出文件 我正在为裸机进行编译 并且我非常关心大小 我可以用arm none eabi objdump由交叉编译器提供 但如果存在用于此任务的工具 则解析输出并不是我渴望做的事情 您知道存在
  • GCC:数组类型具有不完整的元素类型

    我已经宣布了struct 我尝试传递这些结构的数组 以及double双精度数组和一个整数 到一个函数中 我得到一个 数组类型具有不完整的元素类型 当我编译它时来自 gcc 的消息 我在通过考试的过程中犯了什么错误struct到函数 type
  • 什么定义了类型的大小?

    ISO C 标准规定 sizeof char lt sizeof short lt sizeof int lt sizeof long 我在 BIT Linux mint 19 1 上使用 GCC 8 大小为long int is 8 我正
  • 错误:“uint16_t”未声明? [复制]

    这个问题在这里已经有答案了 我有代码 include
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • CPU Relax 指令和 C++11 原语

    我注意到许多使用特定于操作系统的原语实现的无锁算法 例如所描述的自旋锁here http locklessinc com articles locks 使用 Linux 特定的原子原语 经常使用 cpurelax 指令 使用 GCC 可以通
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • C99 中数组的静态大小[重复]

    这个问题在这里已经有答案了 一个非常简单的 C 程序 include

随机推荐

  • R中的参数传递机制

    下面的函数用于将一个序列相乘1 x by y f1 lt function x y return lapply 1 x function a b b a b y 好像a用于表示序列中的元素1 x 但是不知道如何理解这个参数传递机制 在其他
  • java.io.File 中 mkdir() 和 mkdirs() 之间的区别

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 谁能告诉我这两种方法之间的区别 file mkdir file mkdirs mkdirs 还创造了父目录在这个路径中File代表 jav
  • 从常规 ES6 类方法调用静态方法

    调用静态方法的标准方法是什么 我可以考虑使用constructor或者使用类本身的名称 我不喜欢后者 因为它感觉没有必要 前者是推荐的方式 还是还有其他方式 这是一个 人为的 示例 class SomeObject constructor
  • jQuery - keydown / keypress /keyup ENTERKEY 检测?

    尝试让 jQuery 检测 Enter 输入 但检测到空格和其他键 未检测到 Enter 下面有什么问题 entersomething keyup function e alert up var code e keyCode e keyCo
  • RxJS 运算符在事件流中等待安静期,但在事件流繁忙的情况下不会永远等待

    场景 我有一个事件流 每个事件都应该导致信息的更新显示 事件流来自 websockets 显示在 highcharts 图表中 但这并不重要 出于性能原因 我不想为每个事件触发 UI 更新 我宁愿做以下事情 当我收到一个事件时 我只想更新
  • 帮我用“apply”函数替换 for 循环

    如果可能的话 我的任务是找到用户连续参与游戏的最长连续天数 我没有编写 sql 函数 而是选择使用 R 的 rle 函数来获取最长的条纹 然后用结果更新我的数据库表 附加的 数据框是这样的 day user id 2008 11 01 20
  • 日语字符的正则表达式

    我正在 Struts 中进行国际化 我想为日语和英语用户编写 Javascript 验证 我知道英语的正则表达式 但不知道日语用户的正则表达式 是否可以为两个用户编写一个基于 Unicode 进行验证的正则表达式 请帮我 下面是一个正则表达
  • Prolog 中的递归 - 寻找城市之间的路径

    我正在努力完成底部的练习我发现自己对第三点完全困惑 我们获得以下旅游信息知识库 byCar auckland hamilton byCar hamilton raglan byCar valmont saarbruecken byCar v
  • 使用 Zombie.js 验证 Qunit 的结果

    我正在进行测试驱动开发Qunit http qunitjs com 当创建一个新函数时 我为它编写测试 创建函数 重新加载页面 如果所有测试都通过 我就继续 虽然一开始工作正常 但之后它开始成为一个耗时的过程一段时间 因为所有测试都需要几秒
  • 如何在另一个线程上运行阻塞代码并使http请求立即返回

    我们开始了一个新项目Quarkus and Mutiny 并使用 Quarkus 创建了一堆端点 Funq 到目前为止一切都运行良好 现在我们想要在一个端点中处理一些非常耗时的事情 我们期望的是 一旦用户单击按钮从前端发送 http 请求并
  • Javascript 中的递归函数和深度跟踪

    我正在用 JS 编写一个递归函数 但遇到了一些麻烦 让我们从这个非常基本的函数开始 function traverse thing if typeof traverse depth undefined traverse depth 1 el
  • Python 中的“For”循环行为

    为什么下面的简单循环没有保存i在循环的末尾 for i in range 1 10 print i i i 3 以上打印 1 2 3 4 5 6 7 8 9 但它应该打印 1 4 7 for sets i每次迭代 到被迭代对象的下一个值 无
  • 运行 `yo angular` 时出现很多“npm ERR!”

    我正在努力让 Yeoman 工作 但是却是一堵又一堵墙 感谢上帝的 stackoverflow 和所有好心人的帮助 无论如何 我一直在努力奔跑yo angular 但我得到了一堆npm ERR 包括 npm ERR Please try r
  • Plotly:如何在 x 轴上绘制月份和日期? (忽略年份)

    我正在尝试绘制时间序列数据 并希望 x 轴只是月份和日期 Plotly 要求格式为yyyy mm dd 但我有几年来数据集的每日平均值 所以我只想绘制mm dd在 x 轴上 当我发送一个日期时间时mm dd它假设mm成为那一年 我可以让它绕
  • 自定义适配器 getView 方法在位置 0 处频繁调用

    我有一个 GridView 绑定到自定义 ArrayAdapter 派生
  • Rails jquery 日期选择器时区

    我在尝试使用 Rails 处理 JQuery 日期 时间选择器中的时区时遇到问题 日期选择器正确显示当地时区 问题出现了 当我将所选日期保存到数据库中时 rails 会将其保存为 UTC 时间 即使该时间位于客户端的时区中 当我尝试将时间转
  • 如何包含 头文件并使用 std::numbers

    在 gcc 和 g 版本 11 1 0 上运行 每次我运行这段代码时 我都会遇到问题 它说 std numbers 未声明 我尝试跑步g randomCodeWhileReading cpp o main std c 20在我的终端 我运行
  • 具有大数据集的 DC 和交叉过滤器

    我一直在研究 dc 和 crossfilter js 目前有一个包含 550 000 行 大小为 60mb csv 的大型数据集 并且面临着很多问题 例如浏览器崩溃等 因此 我试图了解 dc 和 crossfilter 如何处理大型数据集
  • 通过 JNI 从 C++ 调用返回字符串的 java 函数 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 C 应用程序中访问 Java 方法 https stackoverflow com questions 992836 how to access the java method in a c
  • 当 __builtin_memcpy 替换为 libc 的 memcpy 时

    有一个C99 posix版本memcpy海湾合作委员会的功能 builtin memcpy 有时它可以被 GCC 替换为 memcpy 的内联版本 而在其他情况下它可以通过调用 libc 的 memcpy 来替换 例如 有人指出here h