使用 movsd 让编译器复制字符

2024-03-30

我想在时间关键的函数中复制相对较短的内存序列(小于 1 KB,通常为 2-200 字节)。 CPU 端的最佳代码似乎是rep movsd。但是我不知何故无法让我的编译器生成此代码。我希望(我隐约记得看到过)使用 memcpy 可以使用编译器内置的内在函数来完成此操作,但基于反汇编和调试,编译器似乎正在使用对 memcpy/memmove 库实现的调用来代替。我还希望编译器足够聪明,能够识别以下循环并使用rep movsd就其本身而言,但似乎并非如此。

char *dst;
const char *src;
// ...
for (int r=size; --r>=0; ) *dst++ = *src++;

有没有办法让Visual Studio编译器生成rep movsd除了使用内联汇编之外的顺序?


我想到了几个问题。

首先,你怎么知道 movsd 会更快?您查看过它的延迟/吞吐量吗? x86 架构充满了不应该使用的旧指令,因为它们在现代 CPU 上效率不高。

其次,如果你使用会发生什么std::copy而不是 memcpy?std::copy可能更快,因为它可以在编译时针对特定数据类型进行专门化。

第三,您是否在项目属性 -> C/C++ -> 优化下启用了内部函数?

当然,我假设还启用了其他优化。

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

使用 movsd 让编译器复制字符 的相关文章

随机推荐

  • 异步方法的并发执行

    使用 async await 模型 我有一个方法可以对 Web 服务进行 3 次不同的调用 然后返回结果的并集 var result1 await myService GetData source1 var result2 await my
  • 通过 RFC 5987 处理带空格的 filename* 参数会导致文件名中出现“+”

    我正在处理一些遗留代码 所以不 我不能只使用带有编码文件名组件的 URL 允许用户从我们的网站下载文件 由于我们的文件名通常采用多种不同的语言 因此它们都存储为 UTF 8 我编写了一些代码来处理 RFC5987 转换为正确的 filena
  • 让 JSF 从 EL 访问 Map 值而不是 bean 字段?

    是否有任何正确的方法来覆盖 JSF 从表达式语言访问 beans 字段的方式 这个想法是模仿这种行为以便访问Map
  • 在 Windows 7 中删除超过 10 天的文件夹的批处理文件

    我想创建一个批处理文件 该文件应使用 Windows 7 删除文件夹中超过 10 天的所有子文件夹 任何帮助 将不胜感激 改编自这是对一个非常相似问题的回答 https stackoverflow com questions 3419091
  • 从整数列表中获取随机数

    如果我有一个整数列表 List
  • 计算出的字体大小大于 Asus Nexus 7 上 CSS 中定义的字体大小

    我在 Asus Nexus 7 用 jQuery Mobile 编写 上运行该网页 我在 CSS 中将字体大小设置为 14px 但在调试过程中 在 PC 上使用 Chrome 我可以看到它的计算大小是 22px HTML 代码如下所示 di
  • Kubernetes 和 AWS:设置 LoadBalancer 以使用预定义的安全组

    正如标题所示 我正在寻找一种方法来强制 LoadBalancer 服务使用 AWS 中预定义的安全组 我不想手动编辑 Kubernetes 为 ELB 创建的安全组的入站 出站规则 我无法在文档中找到任何内容 也没有找到任何可以在网上其他地
  • 使用 jinja 的 Ansible set_fact 列表

    我正在尝试学习 jinja 和 Ansible 这是在 RHEL 7 9 上 ansible 2 9 27 ansible python module location usr lib python2 7 site packages ans
  • 同步睡眠进入 asyncio 协程

    我有一个协程如下 async def download downloader DataManager downloader download DataManager download 方法如下 def download self start
  • 使用 Mojo::IOLoop 将命令输出到套接字而不进行缓冲

    如何在Mojo服务器上以实时模式连续输出命令 对我来说是长ping 我正在寻找 Mojo IOLoop 的一些示例 例如 客户端连接到服务器并请求 ping X X X X 服务器返回非缓冲输出 而服务器上的 ping 返回每一行输出 客户
  • 如何从 TVML 文本字段获取值?

    我正在尝试弄清楚如何使用 TVJS 从 TVML 中的文本字段获取值 但我还没有找到任何相关文档 而且我不想等待文档更新 实际上没有任何绑定到输入的模式 因为我确信除了登录服务之外这是很少使用的情况 我想我可以解析 Xml 但这看起来非常老
  • 警报对话框背景颜色

    我正在使用具有自定义布局的 AlertDialog 布局中TextView的颜色为黑色 因此在Android 4 0上使用Holo Light打开对话框时 文本是可见的 但是 如果您在 Android 2 2 中打开该对话框 由于灰色背景
  • 如何在Unity中正确导入fbx?

    我已经建模了一个对象并导出为 fbx 在 Unity 中导入资源后 会出现一些伪影 这些文物似乎与 Unity 导入有关 而不是 fbx 文件 因为在 Windo3d 3d viever 中查看的模型似乎没有问题 万分感谢 Blender
  • Spark 中打开的文件太多,中止 Spark 作业

    在我的应用程序中 我正在读取 40 GB 的文本文件 这些文件完全分布在 188 个文件中 我拆分此文件并使用 rdd 对在 Spark 中每行创建 xml 文件 对于 40 GB 的输入 它将创建数百万个小 xml 文件 这是我的要求 一
  • IE 9 在悬停时重置背景位置(IE bug?)

    我不敢相信我发现了一些在 IE8 和 IE7 中都有效但在 IE9 中失败的东西 这是我正在处理的页面 网站链接 1 请注意 在 IE9 中 当悬停链接时 浏览器在侧面菜单上如何将背景重置为background position 0 0并且
  • 在 sbt 中添加仅编译时的子项目依赖项

    我有一个多项目包含一个私有宏子项目 其用途仅限于实现其他子项目的方法体 它既不应该出现在其他子项目的运行时类路径上 也不应该以任何形式在其他子项目已发布的 POM 中可见 这样其他 sbt 项目就可以在不知道宏子项目的情况下使用该项目中的库
  • Keycloak 缺少表单参数:grant_type

    我的本地计算机上有独立运行的 keycloak 我创建了名为 spring test 的新领域 然后创建了名为 login app 的新客户端 根据其余文档 POST http localhost 8080 auth realms spri
  • 如何对前 5 个有值的单元格求平均值

    我有一个类似这样的电子表格 我只想对前 5 个包含数据的单元格进行平均 我怎样才能做到这一点 随着列表获取更多数据 如下所示 我希望能够定位一个单元格 如 A10 并从该单元格返回 5 同样 只有当它里面有数据时 所以图像的公式应该是这样的
  • 邮政编码 + 国家/地区到地理坐标

    获取给定国家 地区的给定邮政编码 邮政编码的坐标 纬度 经度 的最完整 精确和可靠的方法是什么 我需要发出大量请求 因此高 API 限制率 甚至可能不存在 会很有用 GeoNames http www geonames org postal
  • 使用 movsd 让编译器复制字符

    我想在时间关键的函数中复制相对较短的内存序列 小于 1 KB 通常为 2 200 字节 CPU 端的最佳代码似乎是rep movsd 但是我不知何故无法让我的编译器生成此代码 我希望 我隐约记得看到过 使用 memcpy 可以使用编译器内置