只说你关心的 module 这块,现在三大编译器只有 MSVC 有比较完善的支持,而且依然是 bug 一吨,所以要正经用的话少不得还得再等几个月。
另外,c++20 的 module 真的只是“替代头文件”用的,而不是“替代包管理”用的。module 的最大作用是加快编译速度,以及防止头文件里没有必要导出的函数啊宏啊之类的内容污染其它引用这个头文件的代码。至于说你关心的和 cargo 这类包管理器对应的东西,你应该去看看 vcpkg,还算不错……
只说你关心的 module 这块,现在三大编译器只有 MSVC 有比较完善的支持,而且依然是 bug 一吨,所以要正经用的话少不得还得再等几个月。
另外,c++20 的 module 真的只是“替代头文件”用的,而不是“替代包管理”用的。module 的最大作用是加快编译速度,以及防止头文件里没有必要导出的函数啊宏啊之类的内容污染其它引用这个头文件的代码。至于说你关心的和 cargo 这类包管理器对应的东西,你应该去看看 vcpkg,还算不错……
这个问题之所以不能实现,是有这样一个原因的:编程语言里的真正的“基础类型”,必须是能反映到 CPU 硬件指令上的类型;而 CPU 能做的指令都是有限的,一般来说,是要求基础类型的长度固定的:比如 float 就是 32 字节,double 就是 64 字节。那么 CPU 在执行一个比如“float 加法”的指令的时候,它能知道自己要做的事情实际上就是“读入两个 32 字节数据,送入一个浮点加法单元,这个单元在经过固定的时间长度之后就能得到结果,之后 CPU 就能进行后续计算”。
而对于你说的这种实际存储长度不定的数据,CPU 一来不能静态地确定每次需要读入 /写出的数据长度,二来也不能固定地知道每次例如加法乘法之类的操作需要运行多长时间。因此即使要在 CPU 上进行相关运算,也几乎必然会先被拆分成几个“子任务”进行计算:先要读入你说的那个 scale/precision 值,然后决定接下来读入多少位整数和小数,甚至可能还要进行一次额外计算来考虑数据计算单元计算一次加法要多少个时钟周期,以便安排接下来的指令。这样复杂的一个东西很显然是不适合作为一个“基础类型”存在的。这也是为啥现有大部分对这种 decimal 类型的实现都是用额外对象 /第三方库之类的东西。
问 c++ 20 有人正经用起来了吗?谈谈感受啊