相关疑难解决方法(0)

Visual Studio中"首选32位"设置的目的是什么?它实际上是如何工作的?

在此输入图像描述

我不清楚编译器在需要时如何自动知道编译为64位.它如何知道什么时候可以自信地针对32位?

我很好奇编译器在编译时如何知道要定位的架构.它是否分析代码并根据它发现的内容做出决定?

.net c# compilation cpu-architecture visual-studio

195
推荐指数
2
解决办法
6万
查看次数

为什么.NET/C#不能优化尾调用递归?

我发现这个问题关于哪些语言优化尾递归.为什么C#不会优化尾递归?

对于具体情况,为什么不将此方法优化为循环(Visual Studio 2008 32位,如果这很重要)?:

private static void Foo(int i)
{
    if (i == 1000000)
        return;

    if (i % 100 == 0)
        Console.WriteLine(i);

    Foo(i+1);
}
Run Code Online (Sandbox Code Playgroud)

.net c# optimization tail-recursion

102
推荐指数
4
解决办法
3万
查看次数

用C检查可用的堆栈大小

我正在使用MinGW和GCC 3.4.5(mingw-special vista r3).

我的C应用程序使用了大量的堆栈,所以我想知道是否有任何方法可以以编程方式告诉剩余多少堆栈,因此如果我发现我即将耗尽,我可以干净地处理这种情况.

如果没有其他方法可以解决可能耗尽堆栈空间的问题?

我不知道我将从哪个堆栈大小开始,因此需要以编程方式识别.

c stack mingw

33
推荐指数
6
解决办法
6万
查看次数

如何在Windows 7 x64上禁用ASLR(地址空间布局随机化)?

如何在Windows 7 x64上禁用ASLR,以便我的程序始终在同一地址加载共享CRT?

windows windows-7 aslr windows-7-x64

25
推荐指数
3
解决办法
5万
查看次数

如何确定(或至少推测)递归方法的堆栈帧大小?

我希望能够在异常发生之前预测适合堆栈的递归调用的数量StackOverflow。为此,我需要找出堆栈上给定方法调用的“足迹”。

有没有办法以编程方式做到这一点?我查看了System.Diagnostics.StackFrameSystem.Diagnostics.StackTrace但找不到任何相关内容。

根据经验,使用这个简单的例子,我发现足迹非常不同:

  • 32 位 vs 64 位:~22k vs ~8k 帧(不同的指针大小是否会导致 ~3x 的增加?)
  • 调试与发布:~22k 与~64k 帧(调试构建添加各种特殊模式边界检查填充 + 调试工具)
  • 非优化与优化:
    • ~22k vs ~51k 调试(预期 - 更少的调试信息)
    • ~64k vs ~51k Release(这很奇怪!也许使用了一些记忆技术?)
  • 附加调试器与未附加调试器:令人惊讶的是,这在 jitted 代码中产生了多大的不同!
    • 85k 与 258k - 发布,优化开启
    • 14k 与 64k - 调试、优化关闭

很可能不同版本的 .NET 也会产生不同的结果。

总结一下:

看到堆栈帧大小随这些参数变化如此之大,是否有一种编程方法可以在运行时确定给定方法的堆栈帧大小?

“离线”(手动)怎么样?也许至少对于直接的、发布的、非优化的构建?

.net c# clr jit stack-trace

5
推荐指数
0
解决办法
807
查看次数