d避免原始指针
原文
如果你是C++
程序员,考虑共针/独针
,
如果想让代码更通用
,可考虑通用的空*(void*)
类型.但有更好方法.看看:
import core.stdc.stdlib;
void* myInt = malloc(int.sizeof);
*(cast(int*)myInt) = 500;
writeln(*(cast(int*)myInt));
free(myInt);
在C语言
中它很常见,但可更好.可让转换
保存大小信息,可用构
,但也可用D的切片
特性:
import core.stdc.stdlib;
void[] myInt = malloc(int.sizeof)[0..int.sizeof);
现在,通过myInt.length
保存了在int
上分配字节的信息.即赋值
数据到指定
位置时,都要绑定检查它.
强烈推荐不要使用malloc
,它使代码更难读,不安全,不可跟踪,而且更长
.
这样:
void[] myInt = new void[int.sizeof];
效果相同,不必导入
,少写
,可用(-profile=gc)
跟踪代码.
现在,如果为了通用
数据,且不需要堆分配
,要理解union
和std.variant(标签联)
.如果知道数据流
,就不必用标签联
,直接用联
.现在,只需要:
cast(Something*)(voidPointerData)
这是各种音频API
的通用音频缓冲池
示例:
union HipAudioBuffer
{
version(OpenAL)
{
import openal;
ALuint al;
}
version(OpenSLES)
{
import opensles.slinterface;
SLIBuffer* sli;
}
version(XAudio2)
{
import directx.xaudio2;
XAUDIO2_BUFFER* xaudio;
}
}
然后,可直接按属性
来访问"cast"
,而不是从void*
转换数据.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现