所以我的结构如下:
typedef struct tree tree;
struct tree {
tree* child[10];
int value;
};
以及添加子项并返回其地址的函数,如下所示:
tree* tree_add_child(tree* parent, int index)
{
tree* p = *(parent->child + index);
if (p == NULL)
{
p = tree_new_tree(); //malloc new tree - init it - return its address
*(parent->child + index) = p;
}
return p;
}
它按照我想要的方式工作。但我想用parent->child
替换所有parent
s,因为它们指向同一个地址,我觉得不需要额外的内存访问。但是,当我这样做时,我收到一个错误,我正在尝试将tree
分配给tree*
。
我怎么能这样做,是否还有其他任何可以让它运行得更快的优化?
答案 0 :(得分:2)
如果您了解问题,则需要替换
tree* p = *(parent->child + index);
与
tree* p = *(parent + index);
以及parent-> child的另一个实例,以便通过减少内存访问来优化您的程序。
代码中没有冗余的内存访问。
parent->child
和
parent
do 具有相同的地址,编译器知道这一点。它不必查看内存以找出子项的相对地址来自父项。它知道偏移量(在这种情况下为零)。它不像结构包含每个成员的偏移表;他们在编译时就知道了。这是为了使用其成员必须知道结构的完整定义(而不仅仅是通过前向声明的名称)的部分原因。
即使是这种情况,您也不能将碰巧解析的所有表达式替换为相同的地址。类型安全是为了保护您免受这种替换的微妙错误,并确保您只将“tree *”值分配给“tree *”变量(等等),编译器正在帮助您防止错误。 / p>
答案 1 :(得分:0)
我在评论中有这个,但要正确格式化文本太难了......
你现在看起来还不错,但你并没有真正展示你想要做的事情。例如,你是说你试过这个:
tree *p = parent + index;
这是返回错误的原因吗?如果是这样,你是否宣布父母是
struct tree parent;
或
struct tree *parent;
您需要将其声明为第二个。
答案 2 :(得分:0)
你应该尝试:
tree* p = parent + index;