Ale*_*kiy 0 c# pointers unsafe
我有一个非常奇怪的问题.这是我的代码:
<declare E,JV>
<perform some actions with E>
JV.Math_Mul(E);
Run Code Online (Sandbox Code Playgroud)
////
public new void Math_Mul(Matrix a)
{
double[,] vC = new double[a.ColCount, this.RowCount];
externExtensions.MatMul(vC,a.Values ,this.Values, a.RowCount, this.ColCount, a.ColCount);
Values = vC;
CopyB(B.Values,vC);
}
static unsafe void CopyB(double[,] B, double[,] val)
{
int Col = val.GetLength(1);
int j = 0;
fixed (double* pA = B, pB = val)
{
for (int i = 0; i < val.Length; i++)
{
if (i != j * Col)
pA[i-j] = pB[i];
else
j++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在执行CopyB函数之后,E会发生一些事情(这很奇怪,因为它不是CopyB的参数),VS 2012告诉我:无法获取本地或参数'E'的值,因为它在此指令指针处不可用,可能是因为它已经优化了.代码优化已关闭,此代码运行良好,直到我制作了CopyB.那么,问题是什么?E会发生什么,我该怎么办?
PS CopyB用于在乘法后更快地解析矩阵,这是我的数学工具的一部分,我使用块矩阵.
我将非常感谢任何帮助!
让我们简化你的问题:
我在调试器中查看此代码.
static void Foo(int a, int b)
{
DoSomething(a);
DoSomethingElse(b);
}
Run Code Online (Sandbox Code Playgroud)
有时在运行
a后尝试查看调试器时,DoSomething我得到消息"无法获取本地或参数的值'a',因为它在此指令指针处不可用,可能是因为它已被优化掉了." 这是什么意思?
形式参数是变量,这意味着它必须实现为存储位置.由于形式参数的生命周期较短,因此可以在短期池中分配该存储位置.这意味着抖动将使其成为堆栈位置或寄存器.
我们假设它是一个寄存器.寄存器是x86域中的稀缺资源,因此抖动可能希望将该寄存器用于其他内容DoSomethingElse.它知道它可以安全地这样做,因为它知道,没有什么后DoSomethingElse指a; a就抖动而言,它现在已经"死",所以它的寄存器可以用于其他东西.
调试器知道寄存器不再意味着a它不会让你误以为寄存器的值是值a.这个价值已经消失,因为它的存储现在被用于其他东西.
这就解释了为什么在添加新方法调用时调试器的行为发生了变化?
是.在原始程序中,抖动不需要重新使用寄存器,因此在整个方法调用中它具有原始值.
您的实际场景只是这个场景的一个更复杂的版本,涉及三个方法.抖动可能会重新使用代表您的变量的寄存器E.
| 归档时间: |
|
| 查看次数: |
189 次 |
| 最近记录: |