Tag: 编译器构造

__attribute __((构造函数))如何工作?

这似乎很清楚,它应该设置的东西。 什么时候运行? 为什么有两个括号? __attribute__是一个函数吗? macros? 句法? 这在C中工作吗? C ++? 它的function需要是静态的吗? 什么时候__attribute__((destructor))运行? 目标C中的示例 : __attribute__((constructor)) static void initialize_navigationBarImages() { navigationBarImages = [[NSMutableDictionary alloc] init]; } __attribute__((destructor)) static void destroy_navigationBarImages() { [navigationBarImages release]; }

C ++中的常量和编译器优化

我已经阅读了C ++中关于const正确性的所有build议,并且这很重要(部分),因为它有助于编译器优化代码。 我从来没有见过的是对编译器如何使用这些信息来优化代码的一个很好的解释,甚至好的书也不去解释幕后发生的事情。 例如,编译器如何优化一个声明为const的方法,而不是一个应该是的方法。 当你引入可变variables时会发生什么? 他们影响const方法的优化吗?

什么是即时(JIT)编译器呢?

与非JIT编译器相比,JIT编译器具体做什么? 有人可以给一个简洁和易于理解的描述?

为什么C ++编译需要这么长时间?

与C#和Java相比,编译C ++文件需要很长时间。 编译C ++文件比运行普通大小的Python脚本花费的时间要长得多。 我目前正在使用VC ++,但任何编译器都是一样的。 为什么是这样? 我能想到的两个原因是加载头文件和运行预处理程序,但似乎不应该解释为什么需要这么长时间。

在哪里了解VSdebugging器的“魔术名字”

如果你曾经使用Reflector,你可能会注意到C#编译器生成的types,方法,字段和局部variables,应该由debugging器进行“特殊”显示。 例如,以“CS $”开头的本地variables不会显示给用户。 匿名方法的闭包types还有其他特殊的命名约定,自动属性的后台字段等等。 我的问题:在哪里了解这些命名约定? 有谁知道一些文件? 我的目标是使PostSharp 2.0使用相同的约定。

为什么预处理器macros是邪恶的,有什么select?

我一直都这样问,但是我从来没有收到过很好的答案。 我认为在编写第一个“Hello World”之前,几乎所有的程序员都遇到过“macros不该用”,“macros都是恶”等字眼,我的问题是:为什么? 随着新的C + + 11有这么多年后真正的select? 这个简单的部分是关于像#pragma这样的macros,它们是平台特定的和编译器特定的,而且大多数时候像#pragma once这样的严重缺陷#pragma once在至less2个重要的情况下容易出错:在不同的path中有相同的名字,networking设置和文件系统。 但总的来说,macros和它们的用法的替代方法呢?

静态variables存储在哪里(在C / C ++中)?

在一个可执行文件的段(.BSS,.DATA,其他)是存储的静态variables,以便它们没有名称冲突? 例如: foo.c: bar.c: static int foo = 1; static int foo = 10; void fooTest() { void barTest() { static int bar = 2; static int bar = 20; foo++; foo++; bar++; bar++; printf("%d,%d", foo, bar); printf("%d, %d", foo, bar); } } 如果我编译这两个文件并将其链接到一个重复调用fooTest()和barTest的main,则printf语句将独立增加。 有意义的,因为foo和barvariables是翻译单元的局部variables。 但是,存储分配在哪里? 要清楚,假设是你有一个工具链,将输出一个ELF格式的文件。 因此,我相信这些静态variables的可执行文件中必须保留一些空间。 为了讨论的目的,我们假设我们使用GCC工具链。

为什么this()和super()必须是构造函数中的第一个语句?

Java要求,如果你在构造函数中调用this()或super(),它必须是第一个语句。 为什么? 例如: public class MyClass { public MyClass(int x) {} } public class MySubClass extends MyClass { public MySubClass(int a, int b) { int c = a + b; super(c); // COMPILE ERROR } } Sun编译器说“调用super必须是构造函数中的第一条语句”。 Eclipse编译器说:“构造函数调用必须是构造函数中的第一个语句”。 不过,你可以通过重新安排代码来解决这个问题: public class MySubClass extends MyClass { public MySubClass(int a, int b) { super(a + b); // […]

是否有可能dynamic编译和执行C#代码片段?

我想知道是否有可能将C#代码片段保存到文本文件(或任何inputstream),然后执行这些dynamic? 假设提供给我的东西可以在任何Main()块内编译好,是否可以编译和/或执行这个代码? 我宁愿编译它出于性能的原因。 至less,我可以定义一个他们需要实现的接口,然后他们将提供一个实现该接口的代码“部分”。

为什么编译错误“使用未分配的本地变量”?

我的代码如下 int tmpCnt; if (name == "Dude") tmpCnt++; 为什么会出现错误Use of unassigned local variable tmpCnt ? 我知道我没有明确地初始化它,但由于默认值表的值类型初始化0反正。 这个参考文件还提醒我: 请记住,在C#中使用未初始化的变量是不允许的。 但是为什么我必须明确地做,如果它已经默认完成? 如果我不这样做,它会不会得到表现? 就是想…