异质的数据结构
Posted louisekou666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异质的数据结构相关的知识,希望对你有一定的参考价值。
一. 结构(struct)
struct声明创建一个数据类型,可能将不同类型的对象聚合到一个对象中。
编译器维护关于每个结构类型的信息,指示每个字段的字节偏移。利用这些偏移作为内存引用指令中的位移,从而产生对结构元素的引用。
结构的各个字段的选取完全是编译时处理的,机器代码不包含关于字段声明或含字段名字的信息。
结构可以嵌套结构,就像数组可以嵌套在结构中,数组可以嵌套在数组中。
struct prob{ int *p; struct{ int x; int y; }s; struct prob *next; }
字段偏移量:p:0 s.x:8 s.y:12 next:16
二. 联合(union)
用不同的字段来引用相同的内存块,以多种类型来引用同一个对象
与Union语法相同,但语义完全不同
应用:事先知道对一个数据结构中的两个不同字段的使用是互斥的,便可以将这两个字段声明为联合的一部分。
例如:
实现一个二叉树的数据结构,满足:
每个叶子节点都有两个double类型的数据值
每个内部节点都有指向两个孩子节点的指针,但没有数据
可以按如下方式声明一个节点
union node_u{ struct{ union node_u *left; union node_u *right; } internal; double data[2]; }; // 16bytes
缺点:没有办法确定给定节点是叶子结点还是节点
改进:
引入枚举类型,定义联合中的不同选择,然后再创建一个结构,包含一个标签字段和这个联合
typedef num{N_LEAF, N_INTERNAL} nodetype_t; struct node_t{ nodetype_t type; union{ struct{ struct node_t* left; struct node_t* right; }internal; double data[2]; }info; }; // 24bytes
对于字段较少的代码,如上例中只有2个字段,相对于给代码造成的复杂性,使用联合带来的节省是很少的。
对于有较多字段的数据结构,联合带来的节省会更吸引人。
注意:字节顺序问题
三. 数据对齐
对齐原则:任何K字节的基本对象的地址必须是K的倍数
假设一个处理器总是从内存中取8个字节,那地址必须为8的倍数
好处:简化处理器和内存之间接口的硬件设计,提高内存系统的性能
确保每种数据类型按照指定方式来组织和分配,每种数据类型的对象都满足。
以上是关于异质的数据结构的主要内容,如果未能解决你的问题,请参考以下文章
CIKM 2022 AnalytiCup Competition: 联邦异质任务学习
CIKM 2022 AnalytiCup Competition: 联邦异质任务学习