【发布时间】:2015-12-08 15:12:43
【问题描述】:
我主要是一名 C 程序员,我正在寻找一种快速而优雅的解决方案来完成我想要在 C++ 中做的事情。让我们考虑一下这个简单的数据结构
struct mystruct
{
int * array1;
int * array2;
size_t size;
};
两个指针array1 和array2 被认为是两个长度为size 的数组。我需要大量相同的小尺寸(大约2**30 或1.000.000.000)(大约100)。所有这些都将在同一时间被释放。我可以在 C 中执行以下操作,只需 one 调用 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>,禁止收缩,array1 和array2 的分配不会基于每个条目的动态分配?我确实想尽量减少内存分配的影响,因为K 非常很大。
旧版本:
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);
}
【问题讨论】:
-
既然你提到
std::vector你显然已经意识到了,那么困扰你的问题是什么? -
std::vector 有调整大小功能
-
我不知道如何使用
std::vector<mystruct>为array1和array2分配必要的内存...(我确实想尽量减少内存分配调用)。 -
您可以通过两次分配轻松轻松地做到这一点。一个用于结构,另一个用于整数。我明白为什么你不希望每个对象分配一个,但是两个分配而不是一个不会有什么不同。
-
我不是这方面的专家,但考虑到指针别名的限制,我想知道您提出的 C 代码是否真的合法。