Tag: 拳击

为什么编译器发出框指令来比较引用types的实例?

下面是一个简单的genericstypes,它具有一个唯一的通用参数约束引用types: class A<T> where T : class { public bool F(T r1, T r2) { return r1 == r2; } } 由csc.exe生成的IL是: ldarg.1 box !T ldarg.2 box !T ceq 因此,在进行比较之前,每个参数都是装箱的。 但是,如果约束指示“T”不应该是一个值types, 为什么编译器试图将r1和r2框 ?

与generics拳击和拆箱

创build整数集合(例如)的.NET 1.0方法是: ArrayList list = new ArrayList(); list.Add(i); /* boxing */ int j = (int)list[0]; /* unboxing */ 使用这个惩罚是由于拳击和拆箱造成的types安全和性能的缺乏。 .NET 2.0的方法是使用generics: List<int> list = new List<int>(); list.Add(i); int j = list[0]; 拳击的价格(据我了解)是需要在堆上创build一个对象,将堆栈分配的整数复制到新的对象,反之亦然拆箱。 generics的使用如何克服这一点? 堆栈分配的整数是否停留在堆栈上,并从堆中指向(我想这不是因为它会超出范围会发生什么情况)? 似乎仍然需要将其复制到其他地方。 究竟是怎么回事?

自动装箱调用valueOf()?

我试图确定下列陈述是否保证是正确的: ((Boolean)true) == Boolean.TRUE ((Boolean)true) == Boolean.valueOf(true) ((Integer)1) == Integer.valueOf(1) 我一直认为自动装箱就相当于在相应的types上调用valueOf() 。 我在这个话题上看到的每一个讨论似乎都支持我的假设。 但是我能在JLS中find以下内容( §5.1.7 ): 如果值为p的盒子是一个介于-128和127之间(§3.10.1)的inttypes的整数文字,或者是布尔文字true或false (§3.10.3),或者在'\u0000'和(§3.10.4),然后让a和b成为p的任意两个装箱转换的结果。 总是这样, a == b 。 这描述了与 valueOf()相似的行为。 但是似乎没有任何保证valueOf()被实际调用,这意味着在理论上可以有一个实现为自动复制值保留一个单独的专用caching。 在这种情况下,caching自动复制值和常规caching盒装值之间可能不存在标识相等性。 Oracle的自动装箱教程指出事实上, li.add(i)被编译为li.add(Integer.valueOf(i)) ,其中i是一个int 。 但是我不知道教程是否应该被认为是一个权威的来源。 *这是一个比valueOf()略弱的保证,因为它只涉及字面值。

通用枚举的C#非装箱转换为int?

给定一个通用参数TEnum,它总是一个枚举types,有没有什么办法从TEnum强制转换为int,而不是装箱/拆箱? 看到这个示例代码。 这将不必要地打开/取消装箱值。 private int Foo<TEnum>(TEnum value) where TEnum : struct // C# does not allow enum constraint { return (int) (ValueType) value; } 上面的C#是释放模式编译为以下IL(注意装箱和拆箱操作码): .method public hidebysig instance int32 Foo<valuetype .ctor ([mscorlib]System.ValueType) TEnum>(!!TEnum 'value') cil managed { .maxstack 8 IL_0000: ldarg.1 IL_0001: box !!TEnum IL_0006: unbox.any [mscorlib]System.Int32 IL_000b: ret } SO的转换已经被广泛的处理,但是我找不到针对这个具体情况的讨论。

拳击/拆箱和types转换有什么区别?

拳击/拆箱和types转换有什么区别? 通常,这些术语似乎可以互换使用。

为什么比较整数与int可以抛出Java中的NullPointerException?

观察这种情况令我非常困惑: Integer i = null; String str = null; if (i == null) { //Nothing happens … } if (str == null) { //Nothing happens } if (i == 0) { //NullPointerException … } if (str == "0") { //Nothing happens … } 所以,因为我认为拳击操作首先执行(即Java尝试从null值提取int值)和比较操作具有较低的优先级,这就是为什么引发exception。 问题是:为什么在Java中以这种方式实现? 为什么拳击具有更高的优先权,然后比较参考? 或者为什么他们没有在拳击之前对null实施validation? 目前,当NullPointerExceptionexception抛出时,它看起来不一致,并且不会抛出真正的对象types。

拳击发生在C#

我试图收集在C#中发生拳击的所有情况: 将值types转换为System.Objecttypes: struct S { } object box = new S(); 将值types转换为System.ValueTypetypes: struct S { } System.ValueType box = new S(); 将枚举types的值转换为System.Enumtypes: enum E { A } System.Enum box = EA; 将值types转换为接口引用: interface I { } struct S : I { } I box = new S(); 在C#string连接中使用值types: char c = F(); string s1 = […]

为什么Python的数组变慢?

我期望array.array比列表更快,因为数组似乎是unboxed。 但是,我得到以下结果: In [1]: import array In [2]: L = list(range(100000000)) In [3]: A = array.array('l', range(100000000)) In [4]: %timeit sum(L) 1 loop, best of 3: 667 ms per loop In [5]: %timeit sum(A) 1 loop, best of 3: 1.41 s per loop In [6]: %timeit sum(L) 1 loop, best of 3: 627 ms per […]

什么是拳击和拆箱,什么是折衷?

我正在寻找一个清晰,简洁和准确的答案。 作为实际答案,理想情况下,虽然链接到良好的解释欢迎。

将原始长整型数组转换为长整型列表

这可能是一个简单的头脑问题,但我的第一个尝试令人惊讶的完全失败了。 我想采取一系列的原始长度,并把它变成一个列表,我试图这样做: long[] input = someAPI.getSomeLongs(); List<Long> inputAsList = Arrays.asList(input); //Total failure to even compile! 什么是正确的方法来做到这一点?