jjzjj

C++ 参数堆与堆栈,原始类型数组

coder 2024-02-17 原文

我发现了一些关于对象和 STL 的很棒的“堆与堆栈”问题和答案。 ( c++ arguments heap-vs-stack )(如果 vector 或队列等 STL 对象的行为与自定义类对象的行为不同,请告诉我。)

在处理一个编程竞赛问题时,我突然想到原始类型的数组也作为引用传递而不是手动复制(例如,f(bool boo[10][10]) ).

我通过使用基本类型的本地数组并将参数复制到本地数组来解决这个问题。

bool local_boo[10][10]; 
memcpy(local_boo, boo, sizeof(bool) * 10 * 10);

此外,可以安全地假设,当原始类型数组的大小已知且固定时,我只会在每次函数调用时尝试拥有 boo 的单独拷贝。

这是我的问题。

1)有没有更好的方法?

2) 有谁知道任何好的引用资料专门针对在函数调用期间参数是通过堆还是堆栈传递?

3) 除了打印变量的地址并通过检查地址来确定之外,是否有更好的方法来确定是否在堆或堆栈上声明了某些内容?

谢谢。

最佳答案

2) Does anyone know of any good reference that specifically targets whether an argument will be passed through Heap or Stack during the function calls?

call stack在 C++ 标准中没有提到(它是一个实现细节;通过阅读 n3337 或一些更新的标准来检查)。 calling conventions特定于某些实现,因此请研究 ABI为您的系统。 Automatic variables可能不在堆栈上(例如,它们可能只在寄存器中,或者在编译时完全消失)。

在 x86-64 上,大多数 ABI(参见 this)定义前几个(通常是 6 个)参数,当它们是“标量”时,通过寄存器传递(细节,例如参数类型,很重要:浮点值的传递方式与整数不同)。此外,两个标量分量的普通结构在返回时会在大多数 ABI 的两个寄存器中传递。

此外,大多数 C++ 编译器都在实践中 optimizing compilers ,并且他们可以(并且确实)以不同的方式编译调用(例如,他们经常执行一些函数 inlining - 即使没有任何 inline 注释),因此参数的传递确实​​是特定于实现的(并且可以从一个调用站点到另一个相同调用函数的调用站点不同)。

但是,原始 arrays decay into pointers .另请阅读 plain old data .

如果涉及通过堆分配的内存传递一些数据的某些复制构造函数,您可能会想到“在堆上传递的参数”(但这是一种简化,而不是真实的东西)。另请阅读 the rule of five关于RAII .

在某些情况下,根据 as-if rule 允许优化编译器, 用其他东西替换一些内部堆分配(包括一些“堆栈分配”)。

关于C++ 参数堆与堆栈,原始类型数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50562519/

有关C++ 参数堆与堆栈,原始类型数组的更多相关文章

  1. ruby-on-rails - 在 Ruby 中循环遍历多个数组 - 2

    我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代

  2. ruby - 多次弹出/移动 ruby​​ 数组 - 2

    我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby​​数组,我们在StackOverflow上找到一

  3. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  4. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

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

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

  6. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

  7. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

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

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

  9. ruby - 如何在 Ruby 中拆分参数字符串 Bash 样式? - 2

    我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"

  10. ruby - Infinity 和 NaN 的类型是什么? - 2

    我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串

随机推荐