.Net 7里的函数.Ctor和.CCtor是干啥用的呢?你知道吗( 三 )

jmprax跳转到了如下:00007FFE2CFE8888 FF 25 FA 0F 00 00jmpqword ptr [7FFE2CFE9888h]
7FFE2CFE9888h地址的值是00007FFE8A50C7A0
注意这句代码
static string a ="abcd";它实际上被编译成了一个函数 , 当运行到.CCtor的时候 , 会调用它 , 然后对它进行赋值 abcd
>>> 00007ffe`06ac29e0 55pushrbp00007ffe`06ac29e1 4883ec20subrsp,20h00007ffe`06ac29e5 488d6c2420learbp,[rsp+20h]00007ffe`06ac29ea 833d9f410c0000cmpdword ptr [00007ffe`06b86b90],000007ffe`06ac29f1 7405jeConsoleApp3!ConsoleApp3.Program..cctor+0x18 (00007ffe`06ac29f8)00007ffe`06ac29f3 e8e8a4cd5fcallcoreclr!JIT_DbgIsJustMyCode (00007ffe`6679cee0)00007ffe`06ac29f8 48bad83000186c020000 mov rdx,26C180030D8h00007ffe`06ac2a02 488b12movrdx,qword ptr [rdx]00007ffe`06ac2a05 48b9902e00186c020000 mov rcx,26C18002E90h00007ffe`06ac2a0f e8fc85bb5fcallcoreclr!JIT_CheckedWriteBarrier (00007ffe`6667b010)00007ffe`06ac2a14 90nop00007ffe`06ac2a15 4883c420addrsp,20h00007ffe`06ac2a19 5dpoprbp00007ffe`06ac2a1a c3retJIT_CheckedWriteBarrier的原型如下:
extern "C" HCIMPL2_RAW(VOID, JIT_CheckedWriteBarrier, Object **dst, Object *ref)很明显 , 他这就是把ref指向的object完整的传递给dst 。也就是赋值给静态字符串a 。寄存器rcx表示dst , rdx表示ref 。此处可以通过 !dumpobj rdx来查被看对象 。
那么总结下 , .CCtor的作用就是把静态的全局变量对象进行一个初始化 , 这个结果也说明 , 静态全局变量不是在CLR初始化的时候初始化 , 而是在当前类的.CCtor里面初始化的 。
作者:江湖评谈原文:https://www.cnblogs.com/tangyanzhi1111/p/16868020.html版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可 。

.Net 7里的函数.Ctor和.CCtor是干啥用的呢?你知道吗

文章插图

经验总结扩展阅读