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( ...
随机推荐
- show()和隐藏hide() slideDown()和 slideUp() fadeIn()和fadeOut()
1==>显示show()和隐藏hide() 是一组动画 与切换toggle()$("div").show():当不传递参数时,没有动画效果,它将某个元素瞬间显示出来 $(&q ...
- pdfium 例子
#include <stdio.h> #include <fpdfview.h> int main(int argc, char** argv) { FPDF_InitLibr ...
- jmeter beanshell断言接口自动化实例
一.JMeter介绍 Apache JMeter是一款优秀的开源性能测试工具,在国外无论是在性能测试还是接口测试领域都有着非常高的使用率,但由于本身没有完善的中文文档以及典型开源工具特点(界面不美观) ...
- 攻防世界web-NaNNaNNaNNaN-Batman
先把附件下载下来,然后打开,一堆js乱码 把最后的eval修改成alert,再将文件后缀修改成html,用浏览器打开,乱码变正常了 之后把js代码对齐一下,这里用这个网站进行对齐 https://be ...
- 分析-flag被盗
用wireshark打开数据包 寻找http协议的数据 找一个post包进行TCP追踪流 寻找flag
- 【Spring AOP】AOP核心概念(二)
1. 横切关注点 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点. 2. 切面(aspect)-- 本质上仅仅是一个类 类是对物体特征的抽象,切面就是对横切关注点的抽象. 3. 连接点 ...
- luoguP1791 [国家集训队]人员雇佣
题意 考虑先将所有价值加上,之后用最小割求最小代价. 考虑每个点对\((i,j)\),我们这样建边: 1.源点向每个点i连\(\sum\limits E_{i,j}\)容量的边. 2.每个点向汇点连雇 ...
- ORA-12638:身份证明检索失败的解决方法
找到安装目录:E:\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMIN 打开 sqlnet.ora 找到SQLNET.AUTHENTICATION_SERVICE ...
- [技术]SYZOJ 实现网站与评测端分离
SYZOJ 实现分布式评测 这篇博客的起因是学校的OJ因为高考被切断了, 但是我的公网OJ是个实现很不清真的UOJ而且上面只有1core和1GB内存. 费了一些周折部署好syzoj之后大家喜闻乐见地被 ...
- Oracle中如何创建数据库
Oracle数据库的物理结构与MySQL以及SQLServer有着很大的不同.在使用MySQL或SQLServer时,我们不需要去关心它们的逻辑结构和物理结构. 但是在使用Oracle的时候,我们必须 ...