我正在实施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
答案 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
以源代码为例