2

我正在实施 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),它由几个 Particles(**particles) 和一个最佳 Particles(*g) 组成。每个粒子都有一个“C_struct_Class2D”类型的位置、最佳位置和速度。

在一些方法中,我为每个数据分配内存空间并对其进行初始化。但我喜欢整个数据结构在内存中是连续的。这样所有的结构都在地址空间中彼此落后。

内存应如下所示:

C_struct_Swarm
粒子[0]
粒子[0]->pos
粒子[0]->best_pos
粒子[0]->vel
粒子[1]
粒子[1]->pos
粒子[1]->best_pos
粒子[1]->vel
...
...
...
...
粒子[n]
粒子[n]->pos
粒子[n]->best_pos
粒子[n]->vel
g->位置
g->best_pos
g->vel

我怎样才能做到这一点?

问候 sw

4

3 回答 3

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;

我应该注意到,粒子指向的数据与其他成员不连续,所以你所要求的并不完全可能,除非你做一些其他的事情,比如设置 g 始终是第一个粒子,即包含在粒子“阵列”。

注意填充

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

struct __attribute__ ((__packed__)) my_packed_struct
{
    char c;
    int  i;
};
于 2013-02-06T12:09:09.967 回答
0

你不能以你所描述的方式。如果您想要连续的内存块,唯一的解决方案(据我所知)是使用缓冲区(请参阅我的类似答案,可能会让您了解如何实现它)。

于 2013-02-06T12:02:58.130 回答
0

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

以iw源代码为例

于 2013-02-06T12:31:05.317 回答