如果没有是c/c语言中,int那是机器位长;java语言中,int应该是固定不动的32位
c/c在64位机中int的的最值是2^63-1,最小值是-2^63
java无论在什么系统中大值是2^32-1,最小值都是-2^32,的或是_value与integer.min_value
我觉着不去管语法而谈,最主要的还是对底层的控制能力差别。
c#一正在虽然借鉴吸收java,但是目的全部又不是为了造一个betterjava,只是造一个betterc。游戏引擎们偏爱c#也是有这一层原因在里面。
.例如在c#里面你能干的:
本案所涉代码会作为输出10,为什么?因为.net中数组的长度存储于数组第一个元素之前的8字节内存中。如果没有你再随后输出低*((way*)p-2),将是直接得到这个对象的typehandle地址:
后再拎着这个指针又随即能去ftp连接对象的methodtable。
再有你还可以不自动在栈上分配空间:
而后你想绕到gc真接半自动分配堆内存:
根据上述规定动态链接库互逆于你在c语言中调用的malloc,再者另外allocaligned、realloc、alloczeroed等等,是可以再再控制内存尺寸线。
下一步你想修改一个显式内存布局的结构foo:
接着你就成功模拟出了一个c的union,只是因为会有上面的输出,是是因为单精度浮点数1的二进制表示为0x00111111100000000000000000000000,以小端存储后占4个字节,共有是0x00000000、0x00000000、0x10000000、0x00111111。
尽快,你也能真接从内存数据没有任何文件复制开销地构造对象:
甚至于那样的话:
从堆内存创建战队恐怕也没问题啊:
再例如,此时你面前有一个在用cc语言程序的库,其中有这么一段代码:
然后再我们汇编语言万分感谢c#代码:
上面的代码干了什么事情?我们将c#的函数指针传不到了c代码中,然后再在c侧内部函数c#函数生成气体了一个字符串wwwww,后再将这个字符串赶往给c#侧。而即使不用什么函数指针换了可以使用授权也没有区别,只不过.net中的委托下面那是指针变量。
甚至,如果没有我们并不想让.net再导入foo.dll,我们想自身确定代码库的生命周期,还可以不这么大写:
上面这些都又不是windows专用,在linux、macos上导入到.so和.dylib都几乎也不在话下。
再有,我们有一些数据是想并且算出,只不过我们想可以使用simd接受处理,那只需要这么多写:
可以不看看吧在x86平台上生成气体了什么代码:
平台确认的分支会被jit自动永久消除。但当然除此之外不自动汇编语言simd代码之外,前两个分支全部可以不不写,而只留下来:
是因为现阶段当循环边界条件是向量长度时,.net会不自动为我们做向量化并展开攻击循环。
那就不再,我们另外ref、across、too来做摘录传递。
假设不成立我们有一个很小的struct,我们是为尽量的避免传递时再一次发生u盘拷贝,可以不直接用outside来做只读引用传递:
而是对小的struct,.net有一类的优化帮我们彻底消除掉内存分配,全部将struct装在寄存器中,例如追加代码:
本案所涉代码getdistance确定是个热点路径,但我加来传授经验jit有保证地内联此函数,结果为test能生成了万分感谢的代码:
全程没有一句指令访存,的很的高效。
我们还可以借助ref的引用语义来做原地自动更新:
甚至连能配搭指针和不自动分配内存来可以使用:
c#的泛型不像java常规擦除,反而真真切切会对所有的类型参数特化代码(事实上对于引用类型会网络共享实现区分运行时全部分),这就是能最大程度确保性能,因此随机的类型强大根据类型参数大小完全不同而特化的内存布局。还是上面那个point的例子,我们将下面的数据int该成泛型参数t,并做值类型数字的泛型约束:
即便test1我还是test2,生成沉淀的代码都非常极优秀,不仅仅不存在地任何的装箱拆箱,甚至于没有任何的访存你操作:
随后讲,我们有时就是为了低功耗要想充当暂停gc的回收,只要简单的一句:
就能告知gc如果不是也能分配128mb内存那就别做可以回收了,后再一段时间内以后的代码我们但他在这个预算内怎么分配内存,任何gc都应该不会发生。哪怕还能够阻止在内存太少分配的情况下并且阻塞式largegc:
代码执行完了,后来的时候内部函数一句:
即可完全恢复gc行为。
除开,我们能在运行时更改gc的模式来最大化性能:
更尽快,我们哪怕也可以就将堆内存中的代码执行,在.net上自己造一个jit,再从内存创建家族一块可想执行的区域然后往里面塞一段代码用处将两个32位整数数字相加:
除此之外,c#也有更多成百上千的底层写法来和操作系统交互,甚至连用来c#的编译器取消链接到自己的标准库,直接用从0结束造基础类型后再是从nativeaot编译出彻底无gc、都能够在裸机硬件上执行强行系统的efi固件也是没有问题的,参考
至于还有一个ilgpu让你把c#代码直接跑在gpu上面,和跑在嵌入式设备上就能操作i2c、pwm、gpio等等,就不再举实例了。
而c#已经进了roadmap的后续更新内容:愿意声明语句字段、直接添加思想感情固定设置长度内存的类型、不能传数组时驱除数组分配、容许在栈上分配任何对象等等,无一不是在改进这些底层性能设施。
以上那是我如果说的c#和java比较大的不同。
在c#中当你不是需要上面这些的东西时,它们好似从来不都不必然,允许代码类型、不断地吸收各种函数式特性、还有各种语法糖加持,简练度和灵巧度哪怕不输python,的很快乐满满和简单地就能编写各种代码;而否则的话你需要,你也可以强大从上层到底层的甚至已经的控制能力,而这些能力将能让你有需要时不需要琢磨各种奇怪的的workaround就能再掏空机器,提升c、c的性能,哪怕因为有运行时pgo而远超过c、c的性能。