如何将几个结构连续放入内存?

时间:2013-02-06 11:57:27

标签: c memory struct malloc space

我正在实施PSO算法。我用这个 数据结构:

typedef struct {
  float x;
  float y;
} C_struct_Class2D;

typedef struct {
  C_struct_Class2D *pos;
  C_struct_Class2D *best_pos;
  C_struct_Class2D *vel;
} C_struct_Particle;

typedef struct { <br>
  C_struct_Particle **particles;
  C_struct_Particle *g;
} C_struct_Swarm;

我必须使用C,而不是使用C ++。这就是为什么我使用结构类本的实例。

结构描述:

有一个Swarm(C_struct_Swarm),它由几个粒子(**粒子)和一个最佳粒子(* ​​g)组成。每个粒子都有一个位置,最佳位置和类型速度 “C_struct_Class2D”。

在一些方法中,我为每个数据分配内存空间并初始化它。但我喜欢 整个数据结构在内存中是连续的。所有结构都是 在地址空间中彼此相邻。

内存应如下所示:

C_struct_Swarm
particles[0]
particles[0]->pos
particles[0]->best_pos
particles[0]->vel
particles[1]
particles[1]->pos
particles[1]->best_pos
particles[1]->vel
...
...
...
...
particles[n]
particles[n]->pos
particles[n]->best_pos
particles[n]->vel
g->pos
g->best_pos
g->vel

我怎样才能做到这一点?

此致 SW

3 个答案:

答案 0 :(得分:2)

按值列出成员

在C_struct_Particle中包含C_struct_Class2D:

typedef struct {
    C_struct_Class2D pos; 
    C_struct_Class2D best_pos; 
    C_struct_Class2D vel; 
} C_struct_Particle;

这保证了这些成员的顺序(pos在best_pos之前是在vel之前)。

分配一系列项目,而不是指向项目的指针数组

typedef struct {
    C_struct_Particle *particles;
    int num_particles;
    C_struct_Particle g;
} C_struct_Swarm;

我应该注意,在这里,粒子指向的数据与其他成员不相邻,所以你要求的并非完全可能,除非你做其他像set g这样的东西总是第一个粒子,即包含在粒子“阵列”中。

注意填充

如果您不关心填充(并且在您的代码示例中看起来没有),请跳过此步骤。否则它是特定于平台/编译器的。例如,在GCC中,您可以使用packed attribute

struct __attribute__ ((__packed__)) my_packed_struct
{
    char c;
    int  i;
};

答案 1 :(得分:0)

你不能以你所描述的方式。如果你想要连续的内存块,唯一的解决方案(据我所知)就是使用缓冲区(参见我的similar answer,可能会让你知道如何实现它)。

答案 2 :(得分:0)

如果您使用gcc,对于静态对象,您可以尝试__attribute__ ...更多信息http://gcc.gnu.org/onlinedocs/gcc-3.1/gcc/Variable-Attributes.html

以源代码为例