Tag: clr

JitIntrinsicAttribute如何影响代码生成?

我浏览.NET源代码并看到了这个属性 。 它说, 可以附加到JIT内部方法/属性的属性 并根据MSDN : 表示修改后的方法是实时(JIT)编译器可以执行特殊代码生成的内在值。 这个类不能被inheritance。 但我很难找到。 在什么样的代码上执行特殊的代码生成? 我的主要猜测是它主要使用像SIMD这样的处理器指令,就像Java JIT那样 。 这是一个例子 。 我对它的加速感到好奇,我想知道Mono是否也这样做了。

c#误解中的小数?

(在尝试分析decimal如何工作时)&&阅读@jonskeet文章并看到msdn ,并思考过去4个小时后,我有一些问题: 在这个链接中他们说的很简单: 1.5 x 10^2有2有效数据 1.50 x 10^2有3有效数字。 1.500 x 10^2有4有效数字等… 好的……我们明白了。 来自jon的文章: sign * mantissa / 10^exponent 像往常一样,符号只是一个位,但有96位尾数和5位指数 ^ _ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^___ ^^^^^ 1 _ 96 5 好 所以max mantiss val = 2^96-1 = 79228162514264337593543950335这是: 7.9228162514264*10^28 (根据我的iphone …无法在windows calc中看到指数表示。) 注意 : 7.9228162514264*10^28有14位有效数字(根据上面的例子) 现在指数为5位的部分是无关紧要的,因为它在分母中 – 所以我需要最小值为2 ^ 0 问题#1: msdn说: 28-29 significant digits 但根据我的样本( 1.500 […]

在显式结构中将几个CLR引用字段相互叠加?

编辑:我很清楚这对于值类型非常有效,我的具体问题是将其用于引用类型。 Edit2:我也知道你不能在结构中覆盖引用类型和值类型,这只是为了将几个引用类型字段相互重叠。 我一直在修补.NET / C#中的结构,我发现你可以这样做: using System; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Foo { } class Bar { } [StructLayout(LayoutKind.Explicit)] struct Overlaid { [FieldOffset(0)] public object AsObject; [FieldOffset(0)] public Foo AsFoo; [FieldOffset(0)] public Bar AsBar; } class Program { static void Main(string[] args) { var overlaid = new Overlaid(); overlaid.AsObject = new Bar(); Console.WriteLine(overlaid.AsBar); […]

WPF .exe – 大文件大小

我正在研究WPF应用程序,发现.exe的大小超过1.2MB。 我想减少最终可执行文件的大小。 代码不超过200 Kb,我在项目中使用了几个.png图像,总共占用了大约20kb。 为什么最终的可执行文件如此之大? 我使用ILDASM统计信息来查看.exe统计信息。 发布以下输出: File size : 1267712 PE header size : 512 (496 used) ( 0.04%) PE additional info : 1547 ( 0.12%) Num.of PE sections : 3 CLR header size : 72 ( 0.01%) CLR meta-data size : 72524 ( 5.72%) CLR additional info : 1160002 (91.50%) CLR method headers […]

“as”关键字如何在内部工作?

我知道这个关键字的function,但我想知道它是如何在较低级别上工作的。 哪一个更快? 它们总能产生相同的结果吗? 如果他们这样做,为什么有两种不同的方式? // Is there an overhead? An internal try catch? Class123 obj = someobject as Class123; if (Class123 != null) { //OK } 要么 Class123 obj = null; if (someobject is Class123) { obj = (Class123)someobject; }

具有未知数量参数的Func

请考虑以下伪代码: TResult Foo(Func f, params object[] args) { TResult result = f(args); return result; } 该函数接受具有未知数量的generics参数的Func和相应参数的列表。 是否可以用C#编写? 如何定义和调用Foo ? 如何将args传递给f ?

C#对象引用如何在内存中/运行时(在CLR中)表示?

我很想知道C#对象引用如何在运行时(在.NET CLR中)在内存中表示。 想到的一些问题是: 对象引用占用多少内存? 在类的范围和方法的范围中定义时它是否不同? 根据此范围(堆栈与堆),它所在的位置是否不同? 对象引用中维护的实际数据是什么? 它只是一个指向它引用的对象的内存地址还是有更多的内存地址? 这是否根据是否在类或方法的范围内定义而有所不同? 与上述问题相同,但这次是在讨论对引用的引用时,例如在通过引用将对象引用传递给方法时。 1和2的答案如何变化?

托管clr和捕获线程exception

我正在尝试编写一个可以加载托管插件的插件系统。 如果有任何exception,主机应该能够卸载插件。 对于我的poc,我在C#中有一个示例代码库,它会抛出这样的exception…… public static int StartUp(string arguments) { Console.WriteLine(“Started exception thrower with args {0}”, arguments); Thread workerThread = new Thread(() => { Console.WriteLine(“Starting a thread, doing some important work”); Thread.Sleep(1000); throw new ApplicationException(); } ); workerThread.Start(); workerThread.Join(); Console.WriteLine(“this should never print”); return 11; } 然后我有这样的原生win32控制台应用程序.. int _tmain(int argc, _TCHAR* argv[]) { ICLRMetaHost *pMetaHost = […]

是否可以在C#中使用分支预测提示?

例如,我知道它是为gcc定义的,并在Linux内核中用作: #define likely(x) __builtin_expect((x),1) #define unlikely(x) __builtin_expect((x),0) 如果在C#中没有这样的东西是可能的,那么手动重新排序if语句的最佳选择是什么,最可能的情况是第一个? 有没有其他方法可以根据这种类型的外部知识进行优化? 在相关的说明中,CLR知道如何识别保护条款并假设将采用备用分支,使得这种优化不适合用于保护条款,是否正确? (请注意,我意识到这可能是微观优化;我只对学术目的感兴趣。)

GC行为和CLR线程劫持

我正在CLR via C#阅读CLR via C#一书中关于GC的内容,特别是关于CLR何时想要开始收集的内容。 我知道它必须在收集发生之前挂起线程,但它提到它必须在线程指令指针到达安全点时执行此操作。 在它不在安全点的情况下,它会尝试快速找到一个,并通过hijacking线程(在线程堆栈中插入一个特殊的函数指针)来实现。 这一切都很好,花花公子,但我认为托管线程默认是安全的? 我最初认为它可能是指非托管线程,但CLR允许非托管线程继续执行,因为任何使用的对象都应该被固定。 那么,托管线程中的safe point是什么,GC如何确定它是什么? 编辑: 我认为我不够具体。 根据这篇MSDN文章 ,即使调用Thread.Suspend ,在达到safe point之前,线程实际上不会被挂起。 它继续进一步说明safe point是线程执行中可以执行垃圾收集的点。 我想我的问题不清楚。 我意识到一个线程只能在安全点暂停,并且它们必须暂停用于GC,但我似乎无法找到一个明确的答案,关于什么是安全点。 是什么决定了代码中的安全点?