如何避免指针运算中的乘法?

2023-11-21

如果我写

int main(int argc, char *argv[])
{
    int temp[50][3];
    return &temp[argc] - &temp[0];
}

并用 Visual C++ 编译它,我得到:

009360D0 55                   push        ebp  
009360D1 8B EC                mov         ebp,esp  
009360D3 8B 45 08             mov         eax,dword ptr [argc]  
009360D6 8D 0C 40             lea         ecx,[eax+eax*2]  
009360D9 B8 AB AA AA 2A       mov         eax,2AAAAAABh  
009360DE C1 E1 02             shl         ecx,2  
009360E1 F7 E9                imul        ecx  
009360E3 D1 FA                sar         edx,1  
009360E5 8B C2                mov         eax,edx  
009360E7 C1 E8 1F             shr         eax,1Fh  
009360EA 03 C2                add         eax,edx  
009360EC 5D                   pop         ebp  
009360ED C3                   ret  

为什么我会得到一个imul这里的指令而不仅仅是位移等?我觉得这很烦人,因为我正在紧密循环中进行这样的指针算术,而且我怀疑imul正在扼杀其性能。无论如何,这应该是没有必要的。

有没有一种好的方法可以总体上防止这种情况发生,并用更便宜的操作来代替它?

Update:

在我原来的程序中,我尝试添加一个虚拟变量,使每个元素的大小成为 4 的倍数而不是 3,这样编译器就可以使用位移而不是除法。

结果?尽管数据结构更大,程序的运行时间从9.2秒减少到7.4秒。

所以是的,这确实非常慢。


为什么我会得到一个imul这里的指令而不仅仅是位移等?

The multiplication is to divide by 3 (the size of each inner array), using the fact that 0x2AAAAAAB is 231/3. You can't do that with a small number of shifts and adds; multiplication really is the fastest option.

我怀疑imul正在扼杀其性能。

在大多数现代平台上,整数乘法通常与更简单的运算一样快,因此即使它可以被几个移位和加法取代,它也可能是最快的选择。当您遇到性能问题时,请始终进行测量以找到真正的瓶颈;它们常常出现在你最不怀疑的地方。

有没有一种好的方法可以总体上防止这种情况发生,并用更便宜的操作来代替它?

在乘法确实很昂贵的平台上:避免使用大小不合适的数据结构数组;并避免减去指针,因为这需要除以对象大小。

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

如何避免指针运算中的乘法? 的相关文章

  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器

随机推荐

  • 减慢 Twilio 的 TwiML“Say”命令以处理文本转语音数字

    我创建了一个 Twilio 应用程序 其中涉及使用 Twilio 的 TwimL
  • 使用 mocha 的内置承诺支持测试失败的承诺[重复]

    这个问题在这里已经有答案了 我应该如何用摩卡和柴来测试我的承诺是否失败了 我很困惑 因为我最初认为我应该使用 摩卡承诺 但那 软件包现已弃用 我正在使用 mocha 2 1 0 建议 只需使用摩卡中现在内置的承诺测试即可 看 https g
  • 如果第一个项目被移动,如何防止 LazyColumn 自动滚动

    我使用 Jetpack Compose UI 构建一个简单的 TODO 应用程序 这个想法是有一个可以选中或取消选中的任务列表 并且选中的任务应该位于列表的末尾 一切工作正常 除了当我检查屏幕上的第一个可见项目时 它会随着滚动位置向下移动
  • Python 和 MS Word:将 .doc 转换为 .docx?

    我发现了几个与我的问题相似的问题 但没有一个答案接近我的需要 规格 我正在使用 Python 3 没有 MS Word 我的编程机运行的是 OS X 云机也是 linux ubuntu 我在用着python docx从a中提取值 doc每晚
  • dot / Graphviz 的更紧凑的层次布局

    I produce the following PDF with dot 我的主要问题是即使打印出来 字符尺寸也太小A3 此外 图表似乎还可以变得更紧凑 例如 左上角的蓝色 绿色和棕色节点的存在扩展了宽度 但我看不出为什么整个前两行不能向右
  • 如何在电报Python机器人中保存照片?

    我想写一个保存照片的电报机器人 这是我的代码 但它不起作用 我不知道我的问题是什么 def image handler bot update file bot getFile update message photo file id pri
  • Sprite Kit 和播放声音导致应用程序终止

    使用ARC 只是我遇到的一个问题 我有一个 SKScene 在其中使用 SKAction 类方法播放声音效果 SKAction playSoundFileNamed sound wav waitForCompletion NO 现在 当我尝
  • 在 Rails 3 中设置会话超时

    这看起来很简单 我试图让 Rails Active Record 会话在 2 分钟后超时 因此 两分钟后我希望我的用户必须重新登录 我只是在跑步rails server 即 WebBrick 在我的本地开发机器上 我知道这与以下代码有关co
  • 您可以使用异步函数通过 useState 设置初始状态吗

    我的组件依赖于本地状态 useState 但初始值应该来自http响应 我可以传递一个异步函数来设置初始状态吗 如何从响应中设置初始状态 这是我的代码 const fcads gt let good Axios get admin geta
  • 如何在Java中实现行级安全性?

    我目前正在评估身份验证 授权框架 Apache Shiro 看起来很好 但我是缺少行级安全性特征 例如 数据库中可能存在特殊行 这些行只能由具有特殊权限的用户可见和访问 为了避免不必要的往返 我们当前修改 SQL 查询以与我们的授权数据连接
  • 我可以更改 PyCharmProjects 的位置/名称吗?

    我在 Ubuntu 12 04 上使用 PyCharm 3 0 它自动创建了一个名为的文件夹 PyCharmProjects用于存储项目文件夹 是否有可能 更改此文件夹的位置 更改此文件夹的名称 我在界面 JetBrains 网站或设置文件
  • mPDF - 基于元素高度的分页符

    我在用着mpdf在 Laravel 和这个包4 0版本 问题是我有一个不同高度的问题列表 其中有 4 个选项 而且我不知道每个 div 标签的确切高度和近似高度 其中有哪些问题和答案选项 我不想要我的某些部分转到另一个页面的问题 我的问题的
  • html5shiv 无法在 IE8 中运行?

    我无法在 IE8 中使用 HTML5 元素获取样式 我已经搜索过 stackoverflow 和 Google 没有任何建议我尝试过工作 我从一个更复杂的页面开始 我正在将 XHTML 框架转换为 HTML5 并且没有丝毫担心 但是在模拟和
  • 在(c#)库中使用 List 与 LinkedList 的性能差异是什么[重复]

    这个问题在这里已经有答案了 可能的重复 什么时候应该使用 List 和 LinkedList 这个问题与我之前合并的问题有关 与列表与链表 如果我不希望对我的数据结构使用按索引访问 那么通过使用 LinkedList 而不是 List 可以
  • C++ 程序因 std::bad_alloc 而终止,但 valgrind 报告没有内存泄漏

    我的程序失败并显示 std bad alloc 错误消息 该程序是可扩展的 因此我使用 valgrind 在较小的版本上进行了测试 并且没有内存泄漏 这是统计力学的应用 所以我基本上制作了数百个对象 更改它们的内部数据 在本例中为双精度的
  • 应用程序池启动模式:OnDemand 与 AlwaysRunning,哪个最好?

    我的应用程序池一直使用 OnDemand 启动模式 但最近我听说 AlwaysRunning 模式 它允许部署到 IIS 的 ASP NET 应用程序在部署后立即可用 启用此功能似乎会导致 IIS 在应用程序部署后立即启动该应用程序 从而消
  • python:绑定如何工作

    我想了解 python 中的变量绑定到底是如何工作的 让我们看看这个 def foo x def bar print y return bar y 5 bar foo 2 bar 这打印 5 对我来说似乎是合理的 def foo x def
  • 从 url 安装 apk

    我正在尝试从 URL 安装 APK 这是我的代码 Intent promptInstall new Intent android content Intent ACTION VIEW promptInstall setFlags Inten
  • 通过命令行删除 PDF 注释

    有没有办法批量删除所有 PDF 注释 包括突出显示 注释 注释 箭头 例如 通过命令行 下列系列命令解决了我的问题 pdftk in pdf output uncompress sed Annots d pdftk output out p
  • 如何避免指针运算中的乘法?

    如果我写 int main int argc char argv int temp 50 3 return temp argc temp 0 并用 Visual C 编译它 我得到 009360D0 55 push ebp 009360D1