Tag: C#的

更快的代码完成与铛

我正在研究可能的代码完成加速,同时使用clang的代码完成机制。 下面描述的stream程是我在rtags中find的,由Anders Bakken发现的。 翻译单元由守护程序监视文件进行分析以进行更改。 这是通过调用clang_parseTranslationUnit和相关函数( clang_parseTranslationUnit reparse* , dispose* )完成的。 当用户请求在源文件的给定行和列处完成时,守护进程将源文件的最后保存版本和当前源文件的高速caching翻译单元传递给clang_codeCompleteAt 。 ( 锵CodeComplete文档 )。 传递给clang_parseTranslationUnit (从CompletionThread :: process,第271行 )的CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes是CXTranslationUnit_PrecompiledPreamble|CXTranslationUnit_CacheCompletionResults|CXTranslationUnit_SkipFunctionBodes 。 传递给clang_codeCompleteAt (从CompletionThread :: process,305行 )的CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns是CXCodeComplete_IncludeMacros|CXCodeComplete_IncludeCodePatterns 。 对clang_codeCompleteAt的调用非常慢 – 即使在完成位置是合法的成员访问代码( clang_codeCompleteAt文档中提到的预期用例的一个子集)的情况下,也需要大约3-5秒才能获得完成。 IDE代码完成标准看起来太慢了。 有没有办法加快速度?

C ++标准委员会打算在C ++ 11中使用unordered_map破坏它所插入的内容吗?

已解决:这是libstdc ++ <v4.8.2中的一个错误,如果系统上存在GCC v4.8和clang> v3.2将会使用它。 有关报告,请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57619 。 感谢凯西和布赖恩给出了正确的答案。 尼尔 原始问题: 我刚刚失去了三天的时间跟踪一个非常奇怪的bug,unordered_map :: insert()破坏了你插入的variables。 这种非常不明显的行为仅出现在最近的编译器中:我发现叮当3.2-3.4和GCC 4.8是唯一certificate这个“特性”的编译器。 下面是我的主要代码库中的一些简化代码,它演示了这个问题: #include <memory> #include <unordered_map> #include <iostream> int main(void) { std::unordered_map<int, std::shared_ptr<int>> map; auto a(std::make_pair(5, std::make_shared<int>(5))); std::cout << "a.second is " << a.second.get() << std::endl; map.insert(a); // Note we are NOT doing insert(std::move(a)) std::cout << "a.second is now " << […]

为什么C#编译器不是静态方法调用实例方法的错误代码?

下面的代码有一个静态方法Foo() ,调用一个实例方法Bar() : public sealed class Example { int count; public static void Foo( dynamic x ) { Bar(x); } void Bar( dynamic x ) { count++; } } 它编译没有错误*,但在运行时生成运行时绑定exception。 正如所料,删除这些方法的dynamic参数会导致编译器错误。 那么为什么有一个dynamic参数允许编译代码? ReSharper也不会将其显示为错误。 在Visual Studio 2008中编辑1: * 编辑2:添加sealed因为子类可能包含静态Bar(…)方法。 即使是密封的版本,也可以在运行时调用实例方法以外的方法。

重新定义NULL

我正在写地址为0x0000的系统的C代码,并且包含端口I / O。 因此,访问一个NULL指针的任何可能的错误都不会被检测到,同时也会导致危险的行为。 为此,我希望重新定义NULL为另一个地址,例如一个无效的地址。 如果我不小心访问这样的地址,我会得到一个硬件中断,我可以处理这个错误。 我恰好有权访问stddef.h这个编译器,所以我实际上可以改变标准头并重新定义NULL。 我的问题是:这会与C标准冲突吗? 据我在7.17中可以看出的,这个macros是实现定义的。 标准中是否有其他地方说NULL 必须是0? 另一个问题是大量编译器通过将所有内容设置为零来执行静态初始化,而不pipe数据types如何。 即使标准说编译器应该将整数设置为零,指针指向NULL。 如果我将为我的编译器重新定义NULL,那么我知道这样的静态初始化将失败。 我可以认为这是不正确的编译器行为,即使我大胆地手动改变编译器头文件? 因为我确实知道这个特定的编译器在进行静态初始化时不访问NULLmacros。

“#define _GNU_SOURCE”暗示什么?

今天我不得不使用basename()函数, man 3 basename ( 这里 )给了我一些奇怪的消息: 笔记 basename()有两个不同的版本 – 上面描述的POSIX版本和GNU版本 #define _GNU_SOURCE #include <string.h> 我想知道这个#define _GNU_SOURCE是什么意思:它是否#define _GNU_SOURCE了我用GNU相关许可证编写的代码? 或者它只是用来告诉编译器这样的东西,“ 我知道,这套函数不是POSIX,因此不能移植,但我仍然想用它 ”。 如果是这样,为什么不给人们不同的标题,而不必定义一些不起眼的macros来获得一个函数的实现或其他? 有些东西也使我感到困惑:编译器如何知道哪个函数实现与可执行文件链接? 它也使用这个#define吗? 有人有指示给我?

Task.Result与.GetAwaiter.GetResult()相同吗?

我最近正在阅读一些使用大量asynchronous方法的代码,但有时候需要同步执行它们。 代码确实: Foo foo = GetFooAsync(…).GetAwaiter().GetResult(); 这是一样的 Foo foo = GetFooAsync(…).Result; ?

怪异的方式分配二维数组?

在一个项目中,有人推动了这一行: double (*e)[n+1] = malloc((n+1) * sizeof(*e)); 据推测,它可以创build(n + 1)*(n + 1)双精度的二维数组。 据说 ,因为到目前为止,我所说的没有人能够告诉我这到底是什么,也不是它起源于什么地方,为什么它应该起作用(据说它确实有,但我还没有买)。 也许我错过了一些显而易见的东西,但是如果有人能够向我解释上述问题,我会很感激。 因为个人而言,如果我们使用我们真正理解的东西,我会感觉好多了。

GCC编译错误> 2 GB的代码

我有大量的函数总共大约2.8 GB的目标代码(不幸的是,没有办法,科学计算…) 当我尝试链接它们,我得到(预期) relocation truncated to fit: R_X86_64_32S错误,我希望通过指定编译器标志-mcmodel=medium规避。 除了我所控制的链接之外,所有链接库都使用-fpic标志进行编译。 尽pipe如此,错误仍然存​​在,我假设我链接到的一些库不是用PIC编译的。 这是错误: /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start': (.text+0x12): relocation truncated to fit: R_X86_64_32S against symbol `__libc_csu_fini' defined in .text section in /usr/lib64/libc_nonshared.a(elf-init.oS) /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start': (.text+0x19): relocation truncated to fit: R_X86_64_32S against symbol `__libc_csu_init' defined in .text section in /usr/lib64/libc_nonshared.a(elf-init.oS) /usr/lib/gcc/x86_64-redhat-linux/4.1.2/../../../../lib64/crt1.o: In function `_start': (.text+0x20): undefined […]

为什么没有两个只有注释的程序的二进制文件在gcc中完全匹配?

我创build了两个C程序 计划1 int main() { } 计划2 int main() { //Some Harmless comments } AFAIK,编译时,编译器(gcc)应该忽略注释和冗余的空白,因此输出必须相似。 但是,当我检查输出二进制文件的md5sums,他们不匹配。 我也尝试编译优化-O3和-Ofast但他们仍然不匹配。 这里发生了什么? 编辑:确切的命令和那里md5sums是(t1.c是程序1和t2.c是程序2) gcc ./t1.c -o aaa gcc ./t2.c -o bbb 98c1a86e593fd0181383662e68bac22f aaa c10293cbe6031b13dc6244d01b4d2793 bbb gcc ./t2.c -Ofast -o bbb gcc ./t1.c -Ofast -o aaa 2f65a6d5bc9bf1351bdd6919a766fa10 aaa c0bee139c47183ce62e10c3dbc13c614 bbb gcc ./t1.c -O3 -o aaa gcc ./t2.c -O3 -o bbb […]

如何追加一个字符到一个std ::string?

以下失败与错误prog.cpp:5:13: error: invalid conversion from 'char' to 'const char*' int main() { char d = 'd'; std::string y("Hello worl"); y.append(d); // Line 5 – this fails std::cout << y; return 0; } 我也试过了,下面是编译但是在运行时随机performance的: int main() { char d[1] = { 'd' }; std::string y("Hello worl"); y.append(d); std::cout << y; return 0; } 对不起,这个愚蠢的问题,但我已经search谷歌,我可以看到只是“字符数组到字符数组”,“字符数组到字符数组”,等等。