将堆栈上声明的元素添加到静态数组

Posted

技术标签:

【中文标题】将堆栈上声明的元素添加到静态数组【英文标题】:Adding an element that is declared on the stack to a static array 【发布时间】:2020-01-21 19:37:34 【问题描述】:

假设我有一个声明为静态的 std::vector。我可以将在调用函数的堆栈上本地声明的对象添加到向量中而不会产生影响吗?

据我了解,向量将其元素存储在堆上。意思是如果我告诉向量像这样移动元素

myvector.push_back(std::move(element));

它将被存储在堆上并且它的可见性将被保留,对吧?

编辑:我想避免对象被复制,因为它管理其他资源。

我说的对吗?或者这可以更容易完成吗?

【问题讨论】:

通常对象被复制到向量中,所以真的不需要做任何特别的事情。 @Someprogrammerdude 谢谢你的回答!我应该提到,我想避免复制对象,因为它管理资源并且复制对象会弄乱程序。 然后移动(像你一样)应该也能正常工作。 【参考方案1】:

您通常可以通过从具有自动或静态存储的对象复制来复制具有动态存储的初始化对象,反之亦然。是否通过移动复制对象无关紧要。

理论上可以有一些类只有在以某种方式分配时才能正常工作,但是应该使这些类不可复制以防止出现问题。

【讨论】:

“理论上,有些类只有在以某种方式分配时才能正常工作”——我经常听到这样的神秘/神奇类的谈论,它们知道它们是在免费商店分配还是自动分配储存期限。在我编写 C++ 的 20 多年中,我还没有见过一个(除了一些非常做作的和高度特定于平台的示例,只是为了证明一个观点而创建的)。我也没有遇到过我希望/需要一个对象知道这一点的情况。愿意举一个(有用的)例子吗? @JesperJuhl 我遇到的实际案例是来自 Ogre3D 库的与日志记录相关的单例类。如果您想将参数传递给它的构造函数,则必须使用new 创建动态实例,因为构造函数会将第一个创建的实例注册为单例,并且库会在关闭时将其删除。我确信有一些优势,但我怀疑这将是解决设计解决的任何问题的唯一方法。

以上是关于将堆栈上声明的元素添加到静态数组的主要内容,如果未能解决你的问题,请参考以下文章

javascript中知道一个数组中的一个元素的值,如何获取数组下标

在 Stack 上声明大数组

Java数组声明创建和使用以及多维数组Arrays类稀疏数组

如何在 C++ 中声明一个字符串数组?

数据存储的常用结构 堆栈队列数组链表

为什么我们不能在将元素添加到第(n-1)个索引之前将元素添加到List到第n个索引中,即使提供了初始容量也是如此