c++ - C/C++ 分配类似对象的数组数组

标签 c++ c arrays struct

我主要是一名 C 程序员,我正在寻找一种快速而优雅的解决方案来在 C++ 中完成我想做的事情。让我们考虑一下这个简单的数据结构

struct mystruct
{
    int * array1;
    int * array2;
    size_t size;
};

两个指针array1array2被认为是两个长度为 size 的数组.我需要大量的这些(大约 2**301.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 array1array2不会基于每个条目的动态分配?自 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/

相关文章:

c++ - "extern"关键字使用

c++ - Flutter和Linux

.c源文件和.so动态库一起编译

arrays - Elasticsearch查询相同的数组

algorithm - 解决简单(?)数组问题的算法

javascript - AngularJS — Ng 重复数组对象

C++ 后缀 L 与指定 long double

c++ - 当没有为类定义复制构造函数时,是否会发生 RVO 优化?

c++ - 如何找到未初始化的堆栈变量

在 Linux 中收集具有不同参数的 C 代码的输出