- 浏览: 492176 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
hypercube:
markin'
配置D语言编程环境 -
qiezi:
qiezi 写道yangyang_08 写道1 ...
我的编程语言学习经历 -
qiezi:
yangyang_08 写道1、现在如果做并发服务器,楼主选用 ...
我的编程语言学习经历 -
yangyang_08:
1、现在如果做并发服务器,楼主选用什么样的语言架构?2、lua ...
我的编程语言学习经历 -
dearplain:
我也是语言爱好者,不过我一直坚持使用c。
我的编程语言学习经历
以前曾经讨论过使用typedef来完成强类型的数值计算,最终遇到的问题是D里面没办法定义进行全局运算符重载。
最近在struct上找到点灵感,把基本类型用struct包装后使用,就可以重载运算符了,当然效率也是有保证的,D前几个版本已经完成了NRVO,struct也可以在栈上分配,所以不用担心性能,不过编译时注意打开-O选项。
简单测试了一下,性能与基本类型基本上没有差别:
输出:
Length: 3.000000 m, Time: 2.000000 s, speed: 1.500000 m/s
最近在struct上找到点灵感,把基本类型用struct包装后使用,就可以重载运算符了,当然效率也是有保证的,D前几个版本已经完成了NRVO,struct也可以在栈上分配,所以不用担心性能,不过编译时注意打开-O选项。
简单测试了一下,性能与基本类型基本上没有差别:
template WrapStruct(T) { T value; T opCast() { return value; } typeof(*this) opAssign(T)(T v) { value = v; return *this; } static typeof(*this) opCall(T)(T v) { typeof(*this) result; result.value = v; return result; } } struct Length { mixin WrapStruct!(float); Time opDiv(Speed speed) { return Time(value / speed.value); } Speed opDiv(Time time) { return Speed(value / time.value); } char[] toString() { return std.string.format("%f m", value); } } struct Speed { mixin WrapStruct!(float); Length opMul(Time time) { return Length(value * time.value); } char[] toString() { return std.string.format("%f m/s", value); } } struct Time { mixin WrapStruct!(float); Length opMul(Speed speed) { return Length(value * speed.value); } char[] toString() { return std.string.format("%f s", value); } } import std.stdio; import std.date; void main() { { Length length = 30; Speed speed = 3; Time time = length / speed; assert(cast(float)time == 10); time = 5; speed = length / time; assert(cast(float)speed == 6); } { long start = getUTCtime(); float length = 3; float speed = 1.5; float time; for (int i=0; i<100000000; ++i) { time = length / speed; } writefln(getUTCtime() - start); } { long start = getUTCtime(); Length length = 3; Speed speed = 1.5; Time time; for (int i=0; i<100000000; ++i) { time = length / speed; } writefln(getUTCtime() - start); } }
评论
12 楼
qiezi
2007-04-12
是这样的
11 楼
soulmachine
2007-04-12
我以为你能用C++的宏和typedef引入新的类型,开始很是惊奇。现在你的意思是:用C++的带参宏取代D的模板。我的意思再明确一下,不知对不对:C++中引入新的类型只能用struct或class自定义,而D中则多了一个手段,就是typedef。
10 楼
qiezi
2007-04-12
我说的typedef就是D里面的,本身就是强类型的:
这2个类型不能相互赋值,除非强制转型。就连int要赋给Length也要转型,这可能不如上面写的struct方便。改用struct的主要原因就是D里面无法重载全局运算符。
我说C++宏可以实现mixin的功能,这个功能原本就是宏做的事啊。演示代码把上面的D模板改成宏就行了,语法上处理成C++的,肯定也很容易写。
typedef int Length; typedef int Time;
这2个类型不能相互赋值,除非强制转型。就连int要赋给Length也要转型,这可能不如上面写的struct方便。改用struct的主要原因就是D里面无法重载全局运算符。
我说C++宏可以实现mixin的功能,这个功能原本就是宏做的事啊。演示代码把上面的D模板改成宏就行了,语法上处理成C++的,肯定也很容易写。
9 楼
soulmachine
2007-04-12
#include <iostream>
typedef int myInt1;
typedef int myInt2;
int main(int argc, char* argv[])
{
myInt1 a = 1;
myInt2 b = 2;
b = a;
std::cout << b;
return 0;
}
或
#include <iostream>
#define myInt1 int
#define myInt2 int
int main(int argc, char* argv[])
{
myInt1 a = 1;
myInt2 b = 2;
b = a;
std::cout << b;
return 0;
}
在C++中宏和typedef只是为类型取了别名,并不象D中的typedef那样引入了新的类型。qiezi能否给出一段用宏或typedef提供更丰富类型的代码?
typedef int myInt1;
typedef int myInt2;
int main(int argc, char* argv[])
{
myInt1 a = 1;
myInt2 b = 2;
b = a;
std::cout << b;
return 0;
}
或
#include <iostream>
#define myInt1 int
#define myInt2 int
int main(int argc, char* argv[])
{
myInt1 a = 1;
myInt2 b = 2;
b = a;
std::cout << b;
return 0;
}
在C++中宏和typedef只是为类型取了别名,并不象D中的typedef那样引入了新的类型。qiezi能否给出一段用宏或typedef提供更丰富类型的代码?
8 楼
qiezi
2007-04-12
C++也可以用宏的,D的语法是要简洁一些。原本想用typedef,更轻量一些,后来发现还是得用struct。
7 楼
soulmachine
2007-04-12
在C++把同一个基本类型提升为更强的类型,似乎只能用struct 或class对其进行封装(目前只知道这种做法)。你的这段代码核心是一样的,用了struct提供更强的类型,只不过你用了D特有的mixin减少了代码量,看起来简洁了许多
6 楼
qiezi
2007-04-11
在不降低效率的前提下,提供更强的类型,当然也就是更丰富的值语义。C++也有类似的库这样实现,不过C++模板编译效率无法忍受,D在这方面要好得多。
5 楼
oldrev
2007-04-10
今天够多产的啊,哈哈
4 楼
h_rain
2007-04-10
哈哈哈哈!还行,我猜到了!
呵呵,这回也把附加功能加入了!
漂亮!
呵呵,这回也把附加功能加入了!
漂亮!
3 楼
qiezi
2007-04-10
Length length = 3; Time time = 2; writefln("Length: ", length, ", Time: ", time, ", speed: ", length / time);
输出:
引用
Length: 3.000000 m, Time: 2.000000 s, speed: 1.500000 m/s
2 楼
qiezi
2007-04-10
类型安全啊,Time * Time是不能编译通过的,当然你可以定义Length * Length结果是一个面积,你Length * Length的结果赋给一个Length或是Time都是没办法编译通过的,虽然它们只包含一个数值。有些数学(或物理?)库比较需要这种,当然我只简单探讨了一下,深入了我就外行了。
1 楼
h_rain
2007-04-10
封装的很漂亮!
时间*速度=长度
速度*时间=长度
长度/速度=时间
长度/时间=速度
呵呵,很有趣!
只是,我没有明白,这种封装用于什么用途才有实际价值?
安全?附加功能?高层抽象?
时间*速度=长度
速度*时间=长度
长度/速度=时间
长度/时间=速度
呵呵,很有趣!
只是,我没有明白,这种封装用于什么用途才有实际价值?
安全?附加功能?高层抽象?
发表评论
-
D语言模板和编译期执行
2012-07-29 00:15 0D语言模板继承了C++模板的基本用法,在其上做了相当多扩充,近 ... -
Generator
2008-04-09 13:46 1978几种并发编程模型开销(从大到小): Process > ... -
lambda之路...
2007-11-09 22:57 2842DMD最近的版本号加入了闭包,感觉非常有用,虽然有些背后动作, ... -
像Erlang一样写D程序
2007-09-15 10:23 6699琢磨了好久,一直没时间来做它。在讨论这个问题的时候就已经有这想 ... -
[D语言] qsort的尴尬
2007-05-06 21:31 5048phobos里面在stc.c.stdlib里提供了qsort, ... -
简单的单元测试框架
2007-04-10 21:20 3118做了个简单的单元测试框架,只算个毛坯,遇到一些问题。 1、由 ... -
仿STL的vector,写了一组array操作方法。
2007-04-05 23:55 11949文档从MSDN抄过来的,稍稍改了一下。 module ar ... -
编译期执行的效率
2007-03-15 15:58 4185写了一个编译期执行的fibonacci模板: templ ... -
D语言编译期生成和编译期执行技术
2007-02-24 14:35 4096借助D语言新的mixin表达式,可以完成一些代码生成功能,比如 ... -
如何获得一个方法的名字?
2007-01-15 19:24 3461在D语言中,一个方法你可以得到它的指针(函数指针或委托),但不 ... -
D语言的函数编程
2007-01-07 11:17 3820前阵子论坛上有人问我D语言做函数编程怎样,老实说我没怎么想过这 ... -
D语言和python的差异
2007-01-07 10:12 6512这2个语言的比较怪怪的,我最近转换了一些twisted的源文件 ... -
从简单测试看D数组内存分配策略
2007-01-07 09:43 3200D语言动态数组可以在运行期改变大小,这和C++的vector相 ... -
DMD 0.178发布
2006-12-24 15:32 4568What's New for D 0.178 ... -
GDC 0.20发布
2006-12-17 14:35 2763引用 * Updated to DMD 0.177 * Fix ... -
DMD 0.177发布
2006-12-09 18:47 2241没什么亮点,BUG修复得也不多,BUG数量始终保持在250-2 ... -
DMD 0.176发布
2006-12-03 14:22 3031引用 What's New for D 0.176 Dec ... -
D语言的成员函数模板
2006-12-02 20:29 3042DMD 0.166 特性列表中有一条: * ncorp ... -
D语言 在栈上分配对象 以及 无需GC拖管对象
2006-11-28 13:18 2765一、栈上分配对象 C++可以轻易实现在栈上和堆上分配对象,例 ... -
打算把twisted移植到D语言上
2006-11-26 20:14 4180twisted是一个优秀的python网络开发库,以前用它做过 ...
相关推荐
1. **数值计算能力强**:Fortran是一种专门为数值计算和科学计算设计的语言。它提供了丰富的数学库和函数,用于实现各种数学运算、矩阵操作和数值方法。 2. **高性能和效率**:由于Fortran的历史悠久,编译器和优化...
另外,对一些函数的求导问题,其求导、微分也相当复杂,也有必要研究求导、微分的数值计算问题。本软件就是针对这些问题而设计的,内容包括:牛顿-柯特斯(Newton-Cotes)公式、复化求积公式、高斯求积公式、绘制...
另外,对一些函数的求导问题,其求导、微分也相当复杂,也有必要研究求导、微分的数值计算问题。该部分就是针对这些问题而设计的,内容包括:牛顿-柯特斯(Newton-Cotes)公式、复化求积公式、高斯求积公式、绘制...
另外,对一些函数的求导问题,其求导、微分也相当复杂,也有必要研究求导、微分的数值计算问题。该部分就是针对这些问题而设计的,内容包括:牛顿-柯特斯(Newton-Cotes)公式、复化求积公式、高斯求积公式、绘制...
另外,对一些函数的求导问题,其求导、微分也相当复杂,也有必要研究求导、微分的数值计算问题。该部分就是针对这些问题而设计的,内容包括:牛顿-柯特斯(Newton-Cotes)公式、复化求积公式、高斯求积公式、绘制...
数字类型的应用场景最丰富的是在编写数值计算、逻辑判断、循环控制等算法设计时,特别是在数据分析和科学计算中更加常用。 整数(int): Python中的整数运算是准确的,不会出现误差,因此在一些和数值密切相关的...
Fortran语言具有很强的数学计算能力,支持复杂的数学运算和科学计算,包括矩阵运算、数值计算、统计分析等。它还具有高效的性能,可以生成高效的机器代码,使得程序在运行时能够快速执行。 Fortran语言在科学和工程...
通过FLAC3D程序对该补强支护进行数值模拟,计算结果表明:实施该补强加固后,31轨道巷的塑性区分布、顶板下沉量、底鼓量和两帮移近量都较原支护形式有显著降低,现场围岩变形量观测数据也验证了该补强加固的有效性。
它不仅具有强大的数值计算功能,可以处理如:矩阵计算、微积分运算、各种方程的求 解、插值和拟合计算、完成各种统计和优化问题,最新的版本甚至可以进行数字图象处理、小波分析等;同时它还有方便的画图功能和完善...
采用低温液氮吸附法分析了不同破坏类型煤样的孔隙结构特征,通过FHH公式计算了煤体孔隙分形维数,并针对不同变形破坏程度煤的结构差异性进行了对比分析。结果表明:不同破坏类型煤样的瓦斯吸附能力差异显著,煤样的...
•Java语言是一个强类型语言。 –所有变量,必须先声明类型,再使用。 –指定类型的变量,只能装对应的类型的数据。什么样的瓶子装什么样的酒。 •Java 语言支持的类型分为两大类: 基本数据类型和引用...
以往对气泡羽流的理论分析,主要集中在半经验性的积分模型方面,对其流动结构揭示很少.应用作者给出的气一液两相流两方程湍流模型及混合有限...数值计算结果与实验相比,吻合很好,从而也验证了湍流模型的正确有效性.
在声明C#结构体时如果结果体中有数值数组类型, 结构体中的这个成员会被声明成不安全代码, 若要正确编译代码 ,请在单击VS.net中“项目”菜单“属性”菜单项, 在出来的选项卡上选择“生成”, 选中那个选项卡中的...
A数据处理主要应用于数值计算 B辅助设计是用计算机进行产品设计和绘图 C过程控制只能应用于生产管理 D计算机主要用于人工智能 12.当前计算机的应用领域极为广泛,但其应用最早的领域是__B__。 A数据处理 B科学计算 ...
扁平混凝土板的冲切剪切破坏是一种复杂的现象,具有脆性破坏模式,这意味着结构突然破坏并Swift降低了承载能力。... 根据数值结果的比较,计算出了欧洲规范2中使用的设计公式的分项系数,发现该分项系数高于实际值。
计算机进展数值计算时的高准确度主要决定于D.根本字长 24.计算机具有的逻辑判断才能,主要取决于c.编制的软件 25.计算机的通用性使其可以求解不同的算术和逻辑问题,这主要取决于计算机的c.可 编程性 26....
为解决穿煤层倾斜巷道穿层阶段地质条件变化复杂、存在多种巷道围岩弱结构、容易破坏失稳、支护困难的问题,重点分析了巷道穿层过程中存在的典型弱结构类型及其变形破坏特征,并运用数值计算软件FLAC3D模拟分析了不同围...
学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。课程设计是加强学生实践能力的一个强有力手段。课程设计所安排的题目,在难度和深度方面都大于平时的上机训练,要求同学在完成...
学习数据结构与算法的最终目的是解决实际的应用问题,特别是非数值计算类型的应用问题。课程设计是加强学生实践能力的一个强有力手段。课程设计所安排的题目,在难度和深度方面都大于平时的上机训练,要求同学在完成...
二、电子计算机的发展方向 从类型上看,电子计算机技术正在向巨型化、微型化、网络化和智能化方向发展。 未来新一代的计算机 一般来说,信息技术包含三个层次的内容:信息基础技术、信息系统技术和信息应用技术。 ...