递归火山软件开发平台

标题: 关于视窗.结构类,没有封装取结构体指针函数吗? [打印本页]

作者: 呵呵仙8    时间: 2023-11-3 19:06
标题: 关于视窗.结构类,没有封装取结构体指针函数吗?
是不是c++也没有?难道全球都是以成员1首地址作指针的!!
(, 下载次数: 11)
如果本来就没有相关函数,还要加加减减才得出指针的话!!那就直接取成员1首地址还高效了!!

作者: 创世魂    时间: 2023-11-3 19:38

封了

(, 下载次数: 12)




作者: 呵呵仙8    时间: 2023-11-3 19:54
创世魂 发表于 2023-11-3 19:38
封了

怎么感觉是在把整个结构复制到指定内存?我想要一个像取变量地址()一样高效的.取结构体指针()
作者: Xelloss0618    时间: 2023-11-3 22:02
你要先了解火山的结构类是什么:
1、结构类首先它本身是一个基于火山对象类的 C++ 类,而不是结构体。
2、它内部定义了一个真的结构体类型,名称为 结构类::S。
3、结构类并没有 S 结构体类型的成员变量,那就是它默认是不会将结构体实例化的。

综上:
1、你不可能直接取结构类之中的结构体指针,因为它只是个类型,必须将「结构类::S」实例化,才能取它的指针。
2、实例化之后,还要调用结构类内部的 SetStruct、GetStruct 方法来将结构类和结构体的数据互相复制。
3、取结构类首成员的地址,一定程度可以跟结构体地址差不多。
4、如果是一些内存对齐比较特别的结构体,结构类跟结构体的内存布局会不一样,这种就不能将结构类首成员地址当结构体地址使用。
作者: Xelloss0618    时间: 2023-11-3 22:08
火山还提供了另一种叫做「结构基础类」的封装。
这种封装会在类成员里将结构体实例化,然后通过结构体指针来访问结构体的成员。
这种封装获取结构体指针会很简单,你可以看一下官方的例子。

但有两个主要缺点:
1、这种结构体封装要自己写访问结构体成员的属性读和属性写方法。
2、这种结构体不能在表格封装 DLL 函数中使用;
作者: hcwanz    时间: 2023-11-3 22:33
Xelloss0618 发表于 2023-11-3 22:02
你要先了解火山的结构类是什么:
1、结构类首先它本身是一个基于火山对象类的 C++ 类,而不是结构体。
2、 ...

好像c++的类会和结构体一样字节对齐。 (, 下载次数: 13)
(, 下载次数: 14)

作者: hcwanz    时间: 2023-11-3 22:35
本帖最后由 hcwanz 于 2023-11-3 23:07 编辑

所以理论上普通的结构体确实可以直接取首成员地址,当作结构体地址。不过嵌套还是不行。
作者: Xelloss0618    时间: 2023-11-4 00:30
hcwanz 发表于 2023-11-3 22:33
好像c++的类会和结构体一样字节对齐。

只能说大部分结构体和 C++ 类的默认内存布局差不多,但不能完全保证一样。
比如下面的例子,把对齐字节改动一下,就马上不一样了。

(, 下载次数: 14)

作者: hcwanz    时间: 2023-11-4 11:09
本帖最后由 hcwanz 于 2023-11-4 14:36 编辑
Xelloss0618 发表于 2023-11-4 00:30
只能说大部分结构体和 C++ 类的默认内存布局差不多,但不能完全保证一样。
比如下面的例子,把对齐字节改 ...

这是因为对字节对齐进行的设置导致的。因为火山只在定义结构体时定义了这个参数,如果在类定义时一同定义就不会不同了
(, 下载次数: 14)







欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4