d编程
fqbqrr
这个作者很懒,什么都没留下…
展开
-
d中禁止默认构造
struct Point{ this(){}}//不能这样struct Test { @disable this(); //使`Test t;`不行,你必须用构造器. this(int num) {//构造 } //静态`opCall`用`Test()`代替默认构造. static Test opCall() { Test t = Test(1);return t; }}void main() { //Test t; //编译错误原创 2020-10-11 23:28:30 · 270 阅读 · 0 评论 -
d作者的最近论坛聊天记录
@活是否使d像rust那样复杂?要看.无论怎样,你可以在一个个函数上用借贷/物主,你不必重写/重设计.用垃集时没必要用@活.import std;是自找麻烦.我一直反对,但几个月前未经我同意,仍然混进去了,1,因为他破坏代码,所以他阻止在标准库添加新模块.2,它让世上最快的编译器变成猪.主要就是名字冲突问题.对特定变量用@活,我考虑了,但认为不方便广泛使用.你用确定性的析构时,不必用垃集.你可以用移动语义/无须垃集.是的.这类似对函数式编程的处理.在d你可以挨个逐渐的一个个函数上搞函数式/面向对象原创 2020-11-25 23:06:03 · 406 阅读 · 0 评论 -
dmd后端
w.b.(d作者)dmd后端的总体设计是简单的,复杂性来自指令集,没办法的事,内联汇编器也是,intel的初始设计管用了40年.而x87则不行了.重写代码,很难.1%花费500%的时间,还要花几年去解决过去已解决的漏洞.dmd后端12万行,包括:优化器,调试符号信息,生成异常处理表,及大量目标文件格式.实际生成代码约4万行.对现代cpu,调度器没啥用....原创 2020-12-31 09:56:41 · 273 阅读 · 0 评论 -
用d编程
01用d编程你好02用d编程写与写行类型03用d编程变量04用d编程数组05用d编程切片06用d编程–串07用d编程重定向标准io流08用d编程域09用d编程格式化输出10用d编程–当11用d编程开关12用d编程枚举13用d编程值与引用类型14用d编程函数参数15用d编程左值与右值16用d编程编程环境17用d编程单元测试18用d编程空针19用d编程转换20用d...原创 2020-03-02 09:30:34 · 1494 阅读 · 0 评论 -
56用d编程用户定义属性
可给任何声明(结构,类,变量)赋值属性,然后编译时访问他们来改变编译的方式.用户定义属性完全是编译时特征.@Encrypted string name;可以指定多个属性.这样: @Encrypted @Colored string lastName; @(Encrypted,Colored) string address; 属性名可为类型名,用户定义值,基本类型.禁止属性...原创 2020-03-01 12:42:59 · 372 阅读 · 0 评论 -
55用d编程管理内存
管理内存D不显式管理内存.本章为垃集,可以研究std.allocator及各种管理内存方法.取相邻变量地址import std.stdio;void main() { int i; int j; writeln("i: ", &i); writeln("j: ", &j);}D的动态变量放在垃集内存块上.当不用变量了,垃集根据适当算...原创 2020-03-01 12:41:42 · 403 阅读 · 0 评论 -
54用d编程纤程
纤程允许执行一个线程完成多个任务.与线程相比,切换更有效,类似协程(更小)与绿色线程.纤程允许每个线程有多个调用栈.要掌握纤程,必须了解线程的调用栈.参数,局部变量,返回值,函数的临时表达式,及其他执行时的额外信息组成了函数的本地状态运行时调用函数时自动分配和初化函数的本地状态.为函数调用分配的局部存储空间叫栈桢(桢),随着函数调用其他函数,一帧一帧的,当前活动的函数调用是线程的调用栈....原创 2020-03-01 12:40:32 · 430 阅读 · 0 评论 -
53用d编程共享数据
消息传递是安全的并发方法.多线程读写相同数据.共享数据不安全,就是大家(不受控的线程)都要来争.本章虽然简单,但实际中经常遇见.尽管用std.concurrency,对core.thread也是适用的.在d中不是自动共享的.默认为tls(本地线程)的.尽管所有线程都可访问模块级变量,但每个线程只是得到一个副本.import std.stdio;import std.concurrency...原创 2020-03-01 12:39:29 · 385 阅读 · 0 评论 -
52用d编程并发
并行基于并发.并行与并发的区别:并行,是利用多核.而单核也可以并发(多线程),如服务端程序.并行,相互独立,不独立,则为漏洞.并发则可以依赖其他线程结果.并行,由任务封装.并发显式利用线程.并行,易用,只要是独立任务就可正常工作.并发只在基于传递消息时才容易.基于传统的共享锁,很难编写正确的并发程序.D支持两种并发:传递消息(本章)和共享数据(下章).上章的任务基于std.paral...原创 2020-03-01 12:38:14 · 448 阅读 · 0 评论 -
51用d编程并行
std.parallelism程序在多核中并行运算.仅当并行操作真正独立时,才使用这些算法.parallel,并行访问区间元素task,并行执行的任务,asyncBuf,半激进并行迭代输入区间元素map,用输入区间元素半激进并行调用函数amap,用随机访问区间元素全激进并行调用函数reduce,通过随机访问区间元素并行计算void main(){ auto students...原创 2020-03-01 12:36:53 · 412 阅读 · 0 评论 -
50用d编程区间2
容器,算法,区间都是模板std.range包含许多按模板限制与static if的模板示例.区间类型模板.isInputRange isForwardRange isBidirectionalRange isRandomAccessRange isOutputRangevoid print(T)(T range) if (isInputRange!T) {//要求是输入区间...原创 2020-03-01 12:34:34 · 315 阅读 · 0 评论 -
49用d编程区间
把区间与容器/算法结合起来的是模板(非常重要).stl.拉开序幕.d的区间,RandomAccessRange,最强大,随机访问,就是类似数组.import std.stdio;import std.algorithm;void main(){ int [] values = [1,20,7,11]; writeln(values.filter!(value =>...原创 2020-03-01 12:33:14 · 798 阅读 · 0 评论 -
48用d编程插件
模板可以生成函数,结构,联,类,接口和任何其他合法的D代码.模板插件插入模板实例,如下: mixin a_template!(template_parameters)//mixin template EdgeArrayFeature(T, size_t count) {//这里定义`模板插件` T[count] edges; void setEdge(size_t in...原创 2020-03-01 12:30:16 · 329 阅读 · 0 评论 -
47用d编程深入函数
返回类型属性:auto, ref, inout, 和 auto refauto:不需要指定函数返回类型,即可变,占位符.有多个语句,返回各种返回类型的公共类型,如整与双精的公共类型为双精,则返回双精.auto func(int i) { if (i < 0) { return i; // 整 } return i * 1.5; //...原创 2020-03-01 12:28:58 · 463 阅读 · 0 评论 -
46用d编程深入模板
原来模板章仅包含(函数,结构,类)模板和类型模板参数.快速语法.D模板,易定义和使用.更可读,很强大.定义函数,结构,类的模板,只需要提供模板参数列表.T twice(T)(T value) { return 2 * value;}class Fraction(T) { T numerator; T denominator; // ...}上面为快...原创 2020-03-01 12:27:28 · 474 阅读 · 0 评论 -
45用d编程元组
元组Tuple,是std.typecons实现的库特征.合并多个值进一个值.利用std.meta的AliasSeq来完成某些操作.更多可见此import std.stdio;import std.typecons;void main() { auto t = tuple(42, "hello");//可用tuple构建 writeln(t);//Tuple!(int, ...原创 2020-03-01 12:26:09 · 373 阅读 · 0 评论 -
44常用d编程标签和至
标签语法标签:.这个标签给本行的行尾加个名字.还可以anExpression(); end: anotherExpression();,但不常用.void foo(bool condition) { writeln("first"); if (condition) { goto end; } writeln("second");end: ...原创 2020-03-01 12:11:17 · 407 阅读 · 0 评论 -
43用d编程-联
联.联的成员共享内存占用.也可有成员函数struct S { int i; double d;}// ... writeln(S.sizeof);//用-m32编译,上为12,下为8union U { int i; double d;}// ... writeln(U.sizeof);目的是为了不同时间对相同区域按不同类型...原创 2020-03-01 12:08:36 · 409 阅读 · 0 评论 -
42用d编程嵌套
可在内部域中定义嵌套,以缩小符号可见性来帮助封装.定义嵌套函数void outerFunc(int parameter) { int local; void nestedFunc() { local = parameter * 2; } struct NestedStruct { void memberFunc() { ...原创 2020-03-01 12:04:28 · 379 阅读 · 0 评论 -
41用d编程每一
foreach支持:切片,数组,关联数组,区间,库类型(特定),文件(行).对自定义类型,可自定义每一.1,定义区间成员函数,允许与其他区间算法连用.2,定义一个或多个opApply.opApply优先.但一般区间成员函数就足够了,更简单,更常用.当对象有集合概念时,可以每一.否则,没必要 foreach (element; myObject) { // ... ...原创 2020-03-01 12:02:44 · 362 阅读 · 0 评论 -
40用d编程函数指针与λ
函数指针用于存储函数地址,以备后用.类似c语言的函数指针.闭包存储函数指针和上下文,上下文可以是函数执行区域或构或类.闭包也允许其他语言的闭包.&取地址.import std.stdio;int myFunction(char c, double d) { return 42;}void main() { myTemplate(&myFunctio...原创 2020-03-01 12:01:28 · 400 阅读 · 0 评论 -
39用d编程是表达式
a is b是操作符.is(...)是表达式.是表达式,确定表达式是否为真.在static if和限制模板时特别有用.is(T),确定T是个有效类型. static if (is (int)) { writeln("valid"); } else { writeln("invalid"); }整数有效.void不能作为关联类型的键类...原创 2020-03-01 11:59:37 · 406 阅读 · 0 评论 -
38用d编程条件编译
-unittest单元测试.in,out,invariant没有-release.单元测试/合同用于程序正确性.模板只特化实际使用类型.void swap(T)(ref T lhs, ref T rhs) { T temp = lhs; lhs = rhs; rhs = temp;}unittest { auto a = 'x'; auto b...原创 2020-03-01 11:19:54 · 439 阅读 · 0 评论 -
37用d编程位操作
最小可处理的,就是8位,writefln("%s is %s byte(s)", bool.stringof, bool.sizeof);所以bool实际上是一个字节.而不是1位.计算机一次至少读一个字节.寄存器:32位的4字节大小.64位的8字节大小.import std.stdio;void main() { //1073741824 ...原创 2020-03-01 11:17:14 · 306 阅读 · 0 评论 -
36用d编程指针
指针对系统编程很重要,d的指针其实不难,d的有些特征可以替代指针.import std.stdio;void main() { int[] numbers = [ 1, 11, 111 ]; foreach (number; numbers) { number = 0; //复制语义 } writeln("循环后: ", numbe...原创 2020-03-01 11:14:36 · 412 阅读 · 0 评论 -
35用d编程别名本
alias this允许自动转换类型,而opCast是显式转换类型.自动转换成变量的类型或函数返回类型.语法alias 成员变量/函数 this ;import std.stdio;struct Fraction { long numerator; long denominator; double value() const @property { ...原创 2020-03-01 11:10:07 · 297 阅读 · 0 评论 -
34用d编程别名
alias与alias this无关.Stack!(Point!double) randomPoints(size_t count) { auto points = new Stack!(Point!double); // ...}可这样:长名,难读,没必要每个地点都详细说明.如果改,也麻烦,到处改.alias Points = Stack!(Point!double)...原创 2020-03-01 11:07:46 · 321 阅读 · 3 评论 -
33用d编程编译指示
import std.string;void func(A, B)(A a, B b) { pragma(msg, format("用'%s'和'%s'调用",A.stringof, B.stringof)); // ...}void main() { func(42, 1.5); func("你好", 'a');}编译时生成消息.运行时没有.pr...原创 2020-03-01 11:06:00 · 283 阅读 · 0 评论 -
32用d编程模板
模板可编写通用算法/数据结构d模板非常强大.函数,结构,类模板.import std.stdio;void printInParens(T)(T value) { writefln("(%s)", value);}void main() { printInParens(42); // with int printInParens(1.2);...原创 2020-03-01 11:02:38 · 348 阅读 · 0 评论 -
31用d编程属性合同编程
可以指定成员函数作为属性名.这样a.b,b就可能是函数,只要前面加了@属性..length属性不能修改静态数组.对切片,有可能会分配空间,甚至移动到新位置+初化新成员.因为属性,所以调用函数,可以不加().struct Rectangle { double width; double height;} auto garden = Rectangle(10, 20...原创 2020-03-01 11:00:55 · 321 阅读 · 0 评论 -
30用d编程统一调用
用这样variable.foo(arguments)的方式调用foo(variable, arguments)这样的函数class Car { enum economy = 12.5; // 每公升平均 private double fuelAmount; // 公升 this(double fuelAmount) { this....原创 2020-03-01 10:59:18 · 277 阅读 · 0 评论 -
29用d编程封装
封装的目的是为了代码安全,调试容易,当然还有方便理解.可在构/类级别,或在模块级别指定封装关系.词意思public本程序任意访问private限制只能由定义他的模块访问.此外子类不能覆盖基类私成员.package包级访问,属于某包都可以访问.包属性仅包含最里边的包.vertebrate下的所有包都可以访问在animal.vertebrate.cat里定义的...原创 2020-03-01 10:56:52 · 354 阅读 · 0 评论 -
28用d编程模块
static this() 和static ~this(),模块构造和析构函数,每线程一次,总程序一次的,可用shared static this() 和 shared static ~this()一堆模块叫一个包.import std.stdio;选择导入:import std.stdio :writeln;,减少名称冲突本地导入,可以最小化外部依赖import carnivore =...原创 2020-03-01 10:55:23 · 438 阅读 · 0 评论 -
27用d编程消灭
class LifetimeObserved { int[] array; static size_t counter;//静态成员 this() { array.length = 30_000; ++counter; }//结构好像没有(). ~this() { --counter; }}im...原创 2020-03-01 10:53:31 · 306 阅读 · 0 评论 -
26用d编程接口
interface SoundEmitter { // ...}interface SoundEmitter { string emitSound(); //仅声明}interface I { int func(int i) in { } out { //可用进出来保证 }}class Violin : SoundEmitt...原创 2020-03-01 10:52:31 · 381 阅读 · 0 评论 -
25用d编程对象
每个类自带toString opEquals opCmp toHash函数.因为继承自对象类.定义他们,需要盖.因为有hash,所以可以成为关联数组的键.TypeInfo提供类型的信息.每个类型一个.typeid可以访问相关信息.ti可用来比较是否相同,访问特殊函数,决定两个类型是否相同其经常关于运行时类型`.class MusicalInstrument {}class String...原创 2020-03-01 10:51:16 · 415 阅读 · 0 评论 -
24用d编程继承
class SubClass : SuperClass { // ...}class Clock { int hour; int minute; int second; void adjust(int hour, int minute, int second = 0) { this.hour = hour; this.m...原创 2020-03-01 10:49:57 · 350 阅读 · 0 评论 -
22用d编程重载运算符
对类,不能重载opAssign,因为类是按引用的.赋值是引用.重载运算符,主要是为了方便书写.struct TimeOfDay {// ... ref TimeOfDay opOpAssign(string op)(in Duration duration)//(1) if (op == "+") { ...原创 2020-03-01 10:42:03 · 355 阅读 · 0 评论 -
21用d编程可变参数
名字意思__MODULE__模块名__FILE__源文件名__FILE_FULL_PATH__源文件完整路径__LINE__行号__FUNCTION__函数名__PRETTY_FUNCTION__美化函数名__DATE__编译日期__TIME__编译时间__TIMESTAMP__时间戳__VENDOR__...原创 2020-03-01 10:40:35 · 335 阅读 · 0 评论 -
20用d编程结构
结构是值类型,直接复制.可有默认值.如果未初化,则成员自动用该类型的默认值.struct TimeOfDay { int hour; int minute;}//定义 auto periodStart = TimeOfDay(8, 30); auto periodDuration = TimeOfDay(1, 15); immutable period...原创 2020-03-01 10:29:21 · 413 阅读 · 0 评论