d取类的地址
原文
可取类对象
而不是类变量
(即类实例化
)而是对象定义
自身地址
吗?
class MyClass {char c}
...
MyClass MyClassVar;
writeln(&MyClassVar); // 编译
writeln(&MyClass); // 不能编译
类定义
没有地址
,因为它是只在编译时
有的抽象定义
.运行时
并没有类定义
.因此不能取它的地址.
然而,还有typeid(MyClass)
,提供了关于类
的一些信息
的运行时构,但是由于设计
有些问题
,所以不鼓励使用typeid
.
:可取类对象
的地址吗,
从字面
上回答该问题,是的,可转换类变量
为void*
来实现.但"类对象"
表示D中类的实例
.
D术语
在此不同:类变量
是引用
类对象(带类实例
的成员变量
等).
auto c = new C();
"c"
是*变量*
,可访问动态内存
中*对象*
.
正如H.S.Teoh
回答的那样,Python
等可这样,但D
的编译模型
不行.
下面程序
试演示从对象
地址偏移两个void*
大小的成员:
class C {
int i;
}
void main() {
auto c = new C();
const likelyOffsetOfMembers = 2 * (void*).sizeof;
// 在此:
const objectAddrInDynamicMemory = cast(void*)c;
assert(objectAddrInDynamicMemory + likelyOffsetOfMembers == &c.i);
}
如果按extern(C++)
定义类
,则必须替换上面的2
为1
:
extern(C++) class C {
int i;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现