- 主题:C可以做泛型吗?
真实数据访问实现中要考虑了类型的对齐,大小
addr, [<type, align, size>, ...]
把这些信息和内存地址作为参数传入,应该就能实现你需要的能力
【 在 ylh1969 的大作中提到: 】
: 反射是指在通用的程序中,处理任意struct的能力。
: 比如,将任意的struct序列化。
: 这这需要知道struct的成员,名称,类型,长度,位置。
: ...................
--
FROM 120.231.170.*
他说的不是预先定义的数据结构体
比如通过socket接收到110字节,如何在接收端转换成它发送端的结构并访问其中的成员
这就要知道这110字节包含多少字段,每个字段类型大小对齐方式等等
才能实现特定字段的访问
【 在 freyoneby 的大作中提到: 】
: C语言不知道struct的信息?你是指只生声明了一个指针?还是不懂,有来段简单代码
: - 来自 水木社区APP v3.5.7
--
FROM 120.231.170.*
数据的反射信息在c里也可以生成,
做一个解析器,或者手动完成,对代码中的结构体定义
struct {
int a;
char b;
} dummy_t;
根据上下文的对齐规则和数据大小规则,生成类似这个结构
meta meta_dummy_t[3]={ TYPE_INT, ALIGN_4, SIZE_4, MD5_NAME(a),
TYPE_CHAR, ALIGN_4, SIZE_4,MD5_NAME(b),
NULL, NULL, NULL,MD%_NAME(0)};
在发生数据交互时,可以交互这个数据的元数据
(dummy_t*)get_data
(meta*)get_data_meta
跨平台使用是个麻烦,打包int是按照4字节打包,假如目标只接受
8字节对齐int数据访问;这时候需要根据获取的meta_dummy_t改造
当前平台的数据结构布局,并实现赋值;还有一个要注意的是在不同
大小端架构上交换位域数据结构体时顺序也是要转换的
【 在 ylh1969 的大作中提到: 】
: 难点是计算offset。
: struct的offset比较好算,class的,我不会算,只能等着反射来解决了。
: 效率问题,计算一次即可,之后的使用就不必算了。
: ...................
--
FROM 120.231.170.*
和语言没关系,如果编译期确定知道传输的数据结构,那没什么问题
现在是在运行时实现调用者传入一个数据,只有地址和大小,
类似proc_data (void* addr, size_t size)
这个函数又想通过数据的元素位置或者名称实现访问
需要一个和当前数据结构对应的元数据表来实现
prop_at(2),name_of(xx),offset_of(xx)
等等这一类泛化的数据项访问
【 在 dreamr 的大作中提到: 】
: 直接用c++ 有什么不妥吗?
--
FROM 120.231.170.*
可以用两个办法
一是thunk技术,分配一段可执行内存,动态生成这些访问函数
二是,生成源代码,外部调用编译器,生成so,再加载动态库
效率上:
生成速度 执行速度
高 中
低 高
【 在 ylh1969 的大作中提到: 】
: 对,看看6楼。
--
FROM 223.73.235.*
泛型中型是指类型
c++等其他语言,有编译期生成新类型的语法
比如
template<class T,bool is_A>
class SomeType;
这样定义的SomeType是一个类型集合,它由2个变量来确定具体类型
又比如支持设计编译期对生成类型的概念与约束的检测与推导机制
因此,写起来更符合人类思考顺序,也觉得方便
代价是编译器的大量类型和代码推导生成工作
以及,嵌套很深层次和太多模板参数时,代码书写难度急剧提高
满屏幕的< < < > > >
而C语言出发点是对计算机系统的操作抽象;对于类型集合,概念约束这些
泛化,或说是抽象描述能力,从语法上就没有涉及。
这也是为什么用void* 和字符串宏可以做到部分泛型,但丑陋
如这种
#define f(type) op_##type {type * _inst;}
....
【 在 hothail 的大作中提到: 】
: 隐约记得上学的时候,老师说过
: C通过 宏的方式, 可以做,甚至可以多OOP
: 但。。。。丑陋啊
: ...................
--
FROM 120.231.170.*