【发布时间】:2014-06-14 19:39:35
【问题描述】:
我正在尝试将我的数据结构从结构数组更改为数组结构,似乎我正在为此编写大量冗余代码。(我想保留这两个代码。因为其中一个将在 GPU 上运行- Cuda 和其他在 CPU 上)
例如我有
struct constant_node_AoS {
int id;
double Zmiddle;
double Height;
int Bstatus;
double gamma;
double e;
double cc;
double cs;
double spv0;
double spvp;
} nodes_constprop; //actually it is more like nodes_constprop[nNodes];
所以我所做的是: 我创建了一个新结构
struct constant_node_struct_SoA {
int *id;
double *Zmiddle;
double *Height;
int *Bstatus;
double *gamma;
double *e;
double *cc;
double *cs;
double *spv0;
double *spvp;
}nodes_constprop_;
那么我必须有这样的代码来分配内存
nodes_constprop_.id = new int[nNodes]
nodes_constprop_.Zmiddle = new double[nNodes]
nodes_constprop_.Height= new double[nNodes]
.
.
.
还有一个用于移动数据的 for 循环
for (int i=0;i<nNodes;i++){
nodes_constprop_.id[i] = nodes_constprop[i].id;
nodes_constprop_.Zmiddle[i] = nodes_constprop[i].Zmiddle;
nodes_constprop_.Height[i] = nodes_constprop[i].Height;
.
.
.
}
还有另一个用于释放数据的乱码!
所以我想知道也许有一些宏观技巧,或者我不知道其他一些巧妙的想法可以绕过这个烂摊子?
例如,有一个指向结构成员指针及其大小的指针数组,然后 for 循环进入它们并分配它们并移动数据?或者一些可以很好地扩展的解决方案,所以如果我添加多个其他成员,它会自动(或以最小的努力)得到照顾?
例如,有没有办法知道一个结构有多少成员(在编译时 - 例如这里应该是 10)所以用它来知道我的指针数组的大小?
谢谢
【问题讨论】:
-
这实际上是
C或C++或CUDA C/C++?您的标签可能需要修改。 -
看来您的代码可能是 C++,而不是 C。('new' 不是 C)。或许您应该考虑添加“c++”并删除“c”标签?
-
好吧,我没有在我的程序的任何部分使用类。它更多的是 C。但我认为我有使用 new 分配内存的习惯。所以我真的不知道是C还是C++。我主要是混合它们!
-
你不会错过任何东西:结构数组很不方便。除非你追求一些非常具体的东西,否则我建议不要这样做。
-
new int是 C 中的语法错误,因此如果您的代码编译成功,则说明您没有使用 C。CUDA GPU 语言是 C++ 的子集。