草庐IT

c++ - 分配在堆上的数据是否比分配在堆栈上的数据访问速度慢?

coder 2024-02-23 原文

我听到过关于这个问题的不同意见。

有人说访问分配在堆上的数据(即 std::vector 或通过 malloc 分配的动态数组)总是比访问分配在堆栈上的数据慢一点,因为进程必须始终通过中间指针来访问该数据,该数据可能位于完全不同的内存区域;另一方面,他们认为,访问分配在堆栈上的数据不需要通过这个中间指针,而且这些数据很可能已经缓存了。

其他人声称只有数据的分配在堆上比在栈上慢(因为mallocmmap和类似函数的开销),但是访问是不是,除非堆栈和堆位于不同的物理驱动器上。

什么是真相?

最佳答案

事实(至少在大多数现代 cpu 上)是堆栈和堆的性能相同,因为它们都只是 RAM 的一部分。所以取消引用指针几乎是一样的。

不同之处在于堆栈是为您的进程/线程预先分配的,因此您不需要 mallocfree 系统调用来使用它。特别是 malloc 成本很高。另一个区别是可能有一些特定的 CPU 指令用于处理堆栈以提高性能(例如汇编的 pushpop)。然而,这些不太可能与内存访问(如将内存加载到寄存器)本身有任何关系。

另一个区别是,如果您用完堆栈,您的程序将(更有可能)崩溃。而如果您用完了堆,那么您的操作系统可能会使用交换来降低性能数千次。

缓存未命中当然是一个因素,它更常发生在堆上而不是堆栈上。但这仅仅是因为与堆栈相比,堆非常大。但请注意,缓存未命中并不是那么重要,除非您正在编写 CPU 负载非常高的代码。

现在你是对的,std::vector 必须取消引用附加时间。但是这里慢的是取消引用,而不是那些在堆栈或堆上的指针。他们在哪里并不重要。双解引用总是比单解引用慢。

现在也有可能栈和堆在不同的物理设备上。并且这两个设备具有不同的速度(可能堆更快)。但这又与堆栈和堆本身无关。这可能发生在内存的任何两个部分。你真的无能为力。甚至操作系统也不能(好吧,也许可以,我不确定)。是主板的事此外,无论如何,主板很可能会对更快的设备进行降频。

关于c++ - 分配在堆上的数据是否比分配在堆栈上的数据访问速度慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47487263/

有关c++ - 分配在堆上的数据是否比分配在堆栈上的数据访问速度慢?的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. Ruby Koans about_array_assignment - 非平行与平行分配歧视 - 2

    通过ruby​​koans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John

  5. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  6. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  7. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  8. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  9. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  10. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

随机推荐