在堆栈和堆上创建对象数组

新手上路,请多包涵

考虑以下代码:

 class myarray
{
    int i;

    public:
            myarray(int a) : i(a){ }

}

如何在堆栈上创建 myarray 的对象数组以及如何在堆上创建对象数组?

原文由 Light_handle 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

您可以通过以下方式在堆栈上创建对象数组† :

 myarray stackArray[100]; // 100 objects

在堆上† (或“freestore”):

 myarray* heapArray = new myarray[100];
delete [] heapArray; // when you're done

但最好不要自己管理内存。相反,使用 std::vector

 #include <vector>
std::vector<myarray> bestArray(100);

向量是一个动态数组,它(默认情况下)从堆中分配元素。 ††


因为您的类没有默认构造函数,要在堆栈上创建它,您需要让编译器知道将什么传递给构造函数:

 myarray stackArray[3] = { 1, 2, 3 };

或使用向量:

 // C++11:
std::vector<myarray> bestArray{ 1, 2, 3 };

// C++03:
std::vector<myarray> bestArray;
bestArray.push_back(myarray(1));
bestArray.push_back(myarray(2));
bestArray.push_back(myarray(3));

当然,你总是可以给它一个默认的构造函数:

 class myarray
{
    int i;
public:
    myarray(int a = 0) :
    i(a)
    {}
};


† 对于学究:C++ 并没有真正的“堆栈”或“堆”/“freestore”。我们拥有的是“自动存储”和“动态存储”持续时间。在实践中,这与堆栈分配和堆分配保持一致。

††如果你想从堆栈中“动态”分配,你需要定义一个最大大小(堆栈存储提前知道),然后给向量一个新的分配器,以便它使用堆栈。

原文由 GManNickG 发布,翻译遵循 CC BY-SA 3.0 许可协议

要使用以最大大小分配的堆栈内存,并通过运行时选择大小的标准 stl 容器查看它,可以使用 std::span。

 #include <span>
using namespace std;

struct Toto{ int i; char name[20];};
Toto mem[100];
int n=3;
std::span<Toto> s(&mem[0], n);

我的用例涉及一个被调用一百万次并使用几个数组(当前为 std::vectors)的函数。我想知道以这种方式替换 std::vector 是否会更快。还没有尝试过……另一种可能性是分配std :: vector一次而不是一百万次。

原文由 Ludovic Aubert 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题