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)跟踪代码.
现在,如果为了通用数据,且不需要堆分配,要理解unionstd.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*转换数据.

posted @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示