C# 在不同编译下的不同表现
这是我在2018年的时候发在Unity Forums上的帖子, 至今无人回复, 之前是想用TypedReference做DataTable的相关功能的, 可是结果不正确.
System.TypedReference bugged? can't figure out how to use it !!!
C# has some way to get Generic Type target pointer, such as GCHandle / Marshal,
this time I want to use System.TypedReference for getting pointer of any struct, bug I think it's bugged...
I dont know how to report a BUG to Unity, just post it here
here is the code, it works in VS project but not unity project:
void Start()
{
int v1 = ;
int v2 = ; var m1 = __makeref(v1);
var m2 = __makeref(v2); var val1 = __refvalue(m1, int); // val1 is 100
var val2 = __refvalue(m2, int); // val2 is 1000 Debug.Log(val1);
Debug.Log(val2); unsafe
{
*(IntPtr*)(&m1) = new IntPtr((void*)&v2); // 这里应该是把m1的值改变了的 m1应该为1000 val1 = __refvalue(m1, int); // val1 is 100 -- not changed 可是这里m1赋值没有变换, 还是100
val2 = __refvalue(m2, int); // val2 is 1000 Debug.Log(val1);
Debug.Log(val2); var ptr = *(IntPtr*)(&m1);
var p = (int*)ptr.ToPointer();
var data = *p; // data is 1000 -- changed 奇怪的是这里得到的m1的值又是1000 Debug.Log(data);
}
}
And what's more, if I dont Set the pointer of m1, the value of [data] is Strange!!
void Start()
{
int v1 = ;
int v2 = ; var m1 = __makeref(v1);
var m2 = __makeref(v2); var val1 = __refvalue(m1, int); // val1 is 100
var val2 = __refvalue(m2, int); // val1 is 1000 Debug.Log(val1);
Debug.Log(val2); unsafe
{
var ptr = *(IntPtr*)(&m1);
var p = (int*)ptr.ToPointer();
var data = *p; // data is 536019728 [random] -- WTF 更奇怪的是直接取m1的值, 居然不对 Debug.Log(data);
}
}
This issue is happened in unity project, it works as expected in VS project.
the VS project value is :
static unsafe void TT()
{
int v1 = ;
int v2 = ;
var m1 = __makeref(v1);
var m2 = __makeref(v2);
var val1 = __refvalue(m1, int); // val1 is 100
var val2 = __refvalue(m2, int); // val2 is 1000
unsafe
{
*(IntPtr*)(&m1) = new IntPtr((void*)&v2); // m1值被赋值1000
val1 = __refvalue(m1, int); // val1 is 1000 VS工程编译的话, 这个m1值赋值正确的 1000
val2 = __refvalue(m2, int); // val2 is 1000
var ptr = *(IntPtr*)(&m1);
var p = (int*)ptr.ToPointer();
var data = *p; // data is 1000 这里也是正确的
}
}
这个也是偶然想到极限速度对变量赋值的时候看到的做法, 测试以后发现不对劲. 以前大部分时候程序出错我们都会先想到是自己代码写错了, 不过这里可以看出
编译器也是有错的时候的......
C# 在不同编译下的不同表现的更多相关文章
- 关于executemany()方法在不同OS和DB API下的不同表现的测试
昨天在参照着网上写一段关于MySQL连接池的配合gevent多线程调用的代码时遇到了一个问题,自己写的代码根本不能多线程执行,比单会话插入数据慢太多,直到今天早上才发现问题所在,把DB API从MyS ...
- 关于mysql的自增测试,innodb和myisam下的不同表现
关于mysql的自增测试,innodb和myisam下的不同表现 innodb引擎下的自增id测试 1 innodb引擎下,如果显示insert了最大值,那么下次的AUTO_INCREMENT值就是这 ...
- 【问题】Java和Scala混合编译下无法正常使用lombok的问题
工作中有java和scala和混合编译的工程,最近遇到一个问题,就是工程中有依赖java bean的scala文件,编译过程中发现编译器无法找到Java bean 中 lombok生成的getter, ...
- c语言在windows下和Mac下的不同表现!
最近给一个等级考试的C语言培训班上课,学生问起一些++的问题.让我好生为难.因为这些不同的编译器处理方式,在不同的系统下表现并不一致. 不管你洋洋洒洒论述多么一大篇,在事实面前就一下显得苍白了.虽然这 ...
- 在用VC编译下debug和release的什么区别
DEBUG和RELEASE 版本差异及调试相关问题:. 内存分配问题 1. 变量未初始化.下面的程序在debug中运行的很好. thing * search(thin ...
- 由button标签在 IE 8.0 下的异常表现引发的一场血案
写在最前的最后:整篇文章絮絮叨叨说了半天,我得出一个最佳实践:和button标签say goodbay,用 a 标签模拟之. 首先看一个在chrome 下的简单demo 这样的布局在组件开发中再常见不 ...
- VS2010 release编译下进行调试,“当前不会命中任何断点,还没有为文档加载”问题解决方案
在release模式下调试程序,经常出现"当前不会命中任何断点,还没有为文档加载"的问题,可尝试以下方法: 1. 属性 → 配置属性 → C/C++ → 常规 → 调试信息格式:选 ...
- 测试json字符和java对象属性不一样在多个json框架下转换的表现
package com.longge.mytest; import java.io.IOException; import org.junit.Test; import com.alibaba.fas ...
- java中的Enum在@RestController(@ResponseBody) 注解下返回的表现
参考文档 枚举 public enum CouponType { PLATFORM("平台优惠券"), NEWCOMER("新人专享优惠券"), INVITE( ...
随机推荐
- 第十七周博客作业 <西北师范大学| 周安伟>
第十七周作业 助教博客链接https://home.cnblogs.com/u/zaw-315/ 作业要求链接https://www.cnblogs.com/nwnu-daizh/p/11012922 ...
- day71_10_16多表断关联
---恢复内容开始--- 本次环境: 配置settings INSTALLED_APPS = [ # ... 'rest_framework', ] DATABASES = { 'default': ...
- [C4W3] Convolutional Neural Networks - Object detection
第三周 目标检测(Object detection) 目标定位(Object localization) 大家好,欢迎回来,这一周我们学习的主要内容是对象检测,它是计算机视觉领域中一个新兴的应用方向, ...
- [C1W3] Neural Networks and Deep Learning - Shallow neural networks
第三周:浅层神经网络(Shallow neural networks) 神经网络概述(Neural Network Overview) 本周你将学习如何实现一个神经网络.在我们深入学习具体技术之前,我 ...
- NOIP 2011 计算系数
洛谷 P1313 计算系数 洛谷传送门 JDOJ 1747: [NOIP2011]计算系数 D2 T1 JDOJ传送门 Description 给定一个多项式(ax + by)k,请求出多项式展开后x ...
- Ubuntu16.04下安装Cmake-3.8.2并为其配置环境变量
下载安装包 首先我们到官网下载最新的cmake二进制安装包https://cmake.org/files/ 这里,我下载的是比较新的cmake-3.8.2-Linux-x86_64.tar.gz解压安 ...
- java创建泛型的实例
如果存在泛型 T ,要创建它的实例,以下方式行不通 public class xxx { privaye E[] data ; public xxx() { data = new E[10] ; } ...
- json数据转换成结构体
package main import ( "encoding/json" "fmt" ) type IT1 struct { Company string ` ...
- HDU 6298(数学)
题意是给出一个数,找出这个数的三个因子且这三个因子的和等于这个数,输出满足条件的乘积最大的一组因子的乘积,如果不存在这样的因子,就输出 -1. 第一次 wa 了,因为把题目中的 x | n 当做了位或 ...
- backbone 路由传参(可选)
因为维护公司的老项目而接触到backbone.以前是只闻其名,未见其码. 因为其他项目需要跳转到本项目的某个页面,但是需要UI改变. 考虑的方法是给路由添加一个可选参数.代码如下: 正常路由: rou ...