标签: compilation

编译器优化未使用字符串的行为不一致

我很好奇为什么下面的代码:

#include <string>
int main()
{
    std::string a = "ABCDEFGHIJKLMNO";
}
Run Code Online (Sandbox Code Playgroud)

当使用编译时,将-O3产生以下代码:

main:                                   # @main
    xor     eax, eax
    ret
Run Code Online (Sandbox Code Playgroud)

(我完全理解不需要多余的,a因此编译器可以从生成的代码中完全忽略它)

但是以下程序:

#include <string>
int main()
{
    std::string a = "ABCDEFGHIJKLMNOP"; // <-- !!! One Extra P 
}
Run Code Online (Sandbox Code Playgroud)

产量:

main:                                   # @main
        push    rbx
        sub     rsp, 48
        lea     rbx, [rsp + 32]
        mov     qword ptr [rsp + 16], rbx
        mov     qword ptr [rsp + 8], 16
        lea     rdi, [rsp + 16]
        lea     rsi, [rsp + 8]
        xor …
Run Code Online (Sandbox Code Playgroud)

c++ gcc compilation clang compiler-optimization

69
推荐指数
2
解决办法
2894
查看次数

为什么在调试ASP.NET MVC应用程序时不会触发Application_Start()事件?

我目前在我的Global.asax.cs文件中有以下例程:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.MapRoute(
        "Default",                                          
        "{controller}/{action}/{id}",                       
        new { controller = "Arrangement", action = "Index", id = "" }
    );
}

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
    // Debugs the routes with Phil Haacks routing debugger (link below)
    RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)

路由调试器 ......

当我点击时F5,应用程序启动,除非我有一个Index.aspx~/Views/Home/文件夹中命名的视图,我得到"查看丢失"错误消息,虽然我已重新定义默认路由并删除了HomeController.我希望得到路由调试器,如果不是,那至少是一个请求~/Views/Arrangement/Index.aspx.调试时永远不会遇到
断点RegisterRoutes(Routetable.Routes);.

我已经尝试过构建,重建,重新启动VS,清理,重建等等,但似乎没有任何工作.为什么应用程序不运行当前版本的代码?

debugging asp.net-mvc compilation

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

如何在Xcode中减少构建时间/加快编译时间?

通常可以使用哪些策略来减少任何Xcode项目的构建时间?我最感兴趣的是Xcode特定策略.

我正在使用Xcode进行iPhone开发,我的项目正逐渐变得越来越大.我发现编译/链接阶段开始花费比我想要的更多的时间.

目前,我是:

  • 使用静态库使我的大部分代码都不需要在每次清理和构建我的主项目时编译

  • 从我的应用程序中删除了大部分资源,并尽可能在iPhone模拟器中使用硬编码文件系统路径进行测试,这样我的资源就不必在我对其进行更改时不断打包.

我注意到"检查依赖关系"阶段似乎比我想要的时间更长.任何减少这一点的提示都将受到赞赏!

iphone performance xcode compilation build

68
推荐指数
8
解决办法
4万
查看次数

即时编译与提前编译有什么好处?

我最近一直在考虑这个问题,在我看来,JIT编译的大多数优点应该或多或少地归结为中间格式,并且jints本身并不是生成代码的好方法.

所以这些是我经常听到的主要的JIT编译参数:

  1. 即时编译可实现更高的可移植性.这不是因为中间格式吗?我的意思是,一旦你的虚拟字节码在你的机器上得到它,没有什么能阻止你将它们编译成本机字节码.可移植性是"分发"阶段的问题,而不是"运行"阶段.
  2. 那么,那么在运行时生成代码呢?嗯,同样适用.没有什么可以阻止您将实时编译器集成到您的本机程序中以实现真正的及时需求.
  3. 但运行时只需将其编译为本机代码一次,并将生成的可执行文件存储在硬盘驱动器上某处的某种缓存中.当然可以.但它在时间限制下优化了你的程序,而且从那时起它并没有让它变得更好.见下一段.

它不像提前编译也没有优势.即时编译有时间限制:在程序启动时,您不能让最终用户永远等待,因此需要权衡某些事情.大多数时候他们只是减少优化.我的一个朋友有分析证据表明内联函数和"手动"展开循环(在过程中混淆源代码)对他的C#号码运算程序的性能产生了积极影响; 在我这方面做同样的事情,我的C程序填写相同的任务,没有产生任何积极的结果,我相信这是由于我的编译器允许进行广泛的转换.

然而,我们被jitted程序包围.C#Java无处不在,Python脚本可以编译成某种字节码,我确信其他一些编程语言也是如此.我必须有一个很好的理由让我失踪.那么什么使即时编译如此优于提前编译?


编辑为了清除一些混淆,也许重要的是要声明我全都是可执行文件的中间表示.这有很多优点(实际上,实时编译的大多数参数实际上是中间表示的参数).我的问题是如何将它们编译为本机代码.

大多数运行时(或编译器)都倾向于及时或提前编译它们.由于编译器有更多的时间来执行优化,因此提前编译看起来像是一个更好的替代方案,我想知道为什么微软,Sun和所有其他人都在反过来.我对与分析相关的优化有点怀疑,因为我对即时编译程序的经验表现出很差的基本优化.

我用了一个例子与C语言代码,只是因为我需要的例子名列前茅的时间编制与刚刚在时间编译.C代码没有发送到中间表示的事实与情况无关,因为我只需要表明提前编译可以产生更好的即时结果.

jit compilation

68
推荐指数
4
解决办法
2万
查看次数

如何检查程序是否使用调试符号编译?

我想跟踪GIMP中的一些代码,因此需要启用调试符号的GIMP.我不记得我是否在编译期间启用了它们.如何在不重新编译程序的情况下检查?

debugging symbols compilation gimp

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

二维数组初始化器后跟方括号

我在理解这段代码时遇到了问题:

int[] it = new int[][]{{1}}[0];
Run Code Online (Sandbox Code Playgroud)

为什么它是可编译的,我怎么能理解这样的声明?

java arrays compilation

68
推荐指数
6
解决办法
2873
查看次数

Scala双重定义(2种方法具有相同类型的擦除)

我在scala中写了这个,它不会编译:

class TestDoubleDef{
  def foo(p:List[String]) = {}
  def foo(p:List[Int]) = {}
}
Run Code Online (Sandbox Code Playgroud)

编译通知:

[error] double definition:
[error] method foo:(List[String])Unit and
[error] method foo:(List[Int])Unit at line 120
[error] have same type after erasure: (List)Unit
Run Code Online (Sandbox Code Playgroud)

我知道JVM没有对泛型的原生支持,所以我理解这个错误.

我可以写包装List[String],List[Int]但我很懒:)

我很怀疑,但是,有没有另一种方式表达List[String]不是同一种类型List[Int]

谢谢.

scala overloading compilation typeclass type-erasure

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

为什么数组是对象,但不能用作基类?

Java语言规范指定了

在Java编程语言中,数组是对象(§4.3.1),是动态创建的,可以分配给Object类型的变量(§4.3.2).Object可以在数组上调用类的所有方法.

因此,考虑到数组是对象 - 例如,为什么Java设计者决定不允许继承和覆盖它,toString()或者equals()

当前语法不允许创建以数组作为基类的匿名类,但我不认为是他们决定的原因.

java arrays inheritance compilation

66
推荐指数
3
解决办法
2933
查看次数

如何从终端调用文本编辑器?

在Windows命令提示符下,我可以键入notepad helloworld.cpp哪个将创建一个名为helloworld.cpp文件并为我打开记事本.

Mac终端是否有类似的功能,最好使用Textmate或Textedit?

我正在使用Xcode开发工具运行Mac OS X Lion 10.7.

macos terminal compilation

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

无限循环中断方法签名而没有编译错误

我想知道为什么Java中允许以下代码,而不会出现编译错误?在我看来,此代码通过不返回任何内容来中断方法签名String.有人可以解释我在这里缺少的东西吗?

public class Loop {

  private String withoutReturnStatement() {
    while(true) {}
  }

  public static void main(String[] a) {
    new Loop().withoutReturnStatement();
  }
}
Run Code Online (Sandbox Code Playgroud)

java compilation infinite-loop

65
推荐指数
2
解决办法
2912
查看次数