假设您有一个如下定义的节点链表:
C++ 代码
struct node {
node *next;
int i ;
};
将下一个指针作为结构的第一个成员变量有什么好处吗?
我认为人们通过上述方法尝试这个(我可能在这里错了)
node n, m;
*n=&m;
如果上面是正确的,那么像上面那样编码是否正确。什么是正确的方法?
假设您有一个如下定义的节点链表:
C++ 代码
struct node {
node *next;
int i ;
};
将下一个指针作为结构的第一个成员变量有什么好处吗?
我认为人们通过上述方法尝试这个(我可能在这里错了)
node n, m;
*n=&m;
如果上面是正确的,那么像上面那样编码是否正确。什么是正确的方法?
将下一个指针作为结构的第一个成员变量有什么好处吗?
可以达到非常小的性能优势来减少从零偏移成员加载和写入的汇编指令大小,但仅限于没有虚拟表的类(vtbl 是省略的第一个成员)。
如果您想预先构建一个范围/全局分配的列表,它的元素可以如前所述进行初始化。
你可以试试:
struct node {
struct node* next;
int i;
};
node z = {0}, c={&z}, b={&c}, a={&b};
node * stack = &a;
您可以找到有关喜欢列表搜索“linux 内核链接列表”的非常有用的信息:
我现在使用 c++ 模板在我自己的“侵入式节点”通用容器设计中工作,也许这个问题看起来很有趣。
node n, m;
*n = &m;
不是法律代码,也许你的意思是
node n, m;
n.next = &m;
但通常这将通过动态分配来完成
node* n = new node;
n->next = new node;
因为通常你会用它node
来创建一个可变长度的列表。由于列表的长度不同,因此无法声明正确数量的变量,而是必须动态分配节点。