我主要是一名 C 程序员,我正在寻找一种快速而优雅的解决方案来在 C++ 中完成我想做的事情。让我们考虑一下这个简单的数据结构
struct mystruct
{
int * array1;
int * array2;
size_t size;
};
两个指针array1
和 array2
被认为是两个长度为 size
的数组.我需要大量的这些(大约 2**30
或 1.000.000.000
)所有相同的小尺寸(大约 100
)。所有这些都将在同一时间被释放。我可以在 C 中执行以下操作,只需 一次 调用 malloc
其中 K
是我需要的结构数量,N
是数组的大小
编辑版本(见下面的旧版本)
size_t NN = N * sizeof(int);
struct mystruct * my_objects = malloc(K * sizeof(struct mystruct));
int * memory = malloc(2*K*NN);
for(i=0; i<K; ++i)
{
my_objects[i].size = N;
my_objects[i].array1 = memory + 2*i*NN;
my_objects[i].array2 = memory + (2*i+1)*NN;
}
...
free(my_objects);
free(memory);
这个版本不支持非常大K
并且不允许我调整数组的大小。但是为此目的设计一些东西并不难。有没有一种方法可以在 C++ 中创建一个类 std::vector<mystruct>
with forbidden shring and for which the allocation of array1
和 array2
不会基于每个条目的动态分配?自 K
以来,我确实想尽量减少内存分配的影响。 非常大。</p>
旧版本:
size_t KK = K * sizeof(mystruct);
size_t NN = N * sizeof(int);
struct mystruct * my_objects = (struct mystruct *) malloc(KK + 2*K*NN);
for(i=0; i<K; ++i)
{
my_objects[i].size = N;
my_objects[i].array1 = (int *) (my_objects + KK + 2*i*NN);
my_objects[i].array2 = (int *) (my_objects + KK + (2*i+1)*NN);
}
最佳答案
这是我从 C 到 C++ 的字面翻译,它保持相同的内存布局:
std::unique_ptr<int[]> const memory(new int[2 * K * N]);
std::vector<mystruct> my_objects;
my_objects.reserve(K);
for (int i = 0; i < K; ++i)
{
mystruct const tmp = {N, memory + 2*i*NN, memory + (2*i+1)*NN};
my_objects.push_back(tmp);
}
关于c++ - C/C++ 分配类似对象的数组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34159380/