Questions tagged «c»

C是用于系统编程(OS和嵌入式),库,游戏和跨平台的通用编程语言。该标记应与ISO 9899标准(除非另有说明,最新版本9899:2018中定义的有关C语言的一般问题)一起使用-还要使用c89,c99,c11等标记特定于版本的请求。C与C ++截然不同,在没有合理理由的情况下,不应将其与C ++标记结合使用。

4
C比C ++快得多[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案能得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 9年前关闭。 据我了解,所有脚本语言和核心科学程序通常都是用C编写的;这使实现变得凌乱而又直截了当。 我知道这些人想最大限度地发挥他们的性能,但是使用C字符串和C结构与使用C ++类之间确实存在区别。C ++似乎以相同的方式工作,除了虚函数外,它还存储一个类函数一次,并且该类的每个实例都调用该函数。 是什么使C更快,并且在必须是最快的项目(例如python或sqlite)中有显着区别吗?
81 c++  c  performance 

6
C语言中最好的计时方法?
对具有高分辨率和可移植性的代码段进行计时的最佳方法是什么? /* Time from here */ ProcessIntenseFunction(); /* to here. */ printf("Time taken %d seconds %d milliseconds", sec, msec); 是否有一个具有跨平台解决方案的标准库?
80 c  performance  timer  timing 



3
增加“掩码”位集
我目前正在编写树枚举器的过程中遇到以下问题: 我正在查看被屏蔽的位集,即设置的位是掩码的子集的位集,即0000101具有mask的位集1010101。我要完成的是增加位集,但仅是相对于掩码位。在此示例中,结果将为0010000。为了使其更清晰,仅提取被屏蔽的位,即0011,将它们增加到0100并再次将它们分配给屏蔽位,得到0010000。 除了使用bitcans和前缀掩码的组合手动执行操作之外,有人能看到实现此目的的有效方法吗?

3
为什么代码会积极尝试阻止尾调用优化?
问题的标题可能有点奇怪,但据我所知,根本没有什么可以反对尾部调用优化。但是,在浏览开源项目时,我已经遇到了一些主动尝试阻止编译器进行尾部调用优化的功能,例如CFRunLoopRef的实现,其中充斥着此类黑客。例如: static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__() __attribute__((noinline)); static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__(CFRunLoopObserverCallBack func, CFRunLoopObserverRef observer, CFRunLoopActivity activity, void *info) { if (func) { func(observer, activity, info); } getpid(); // thwart tail-call optimization } 我很想知道为什么这看起来如此重要,并且在任何情况下我作为普通开发人员都应该牢记这一点吗?例如。尾部调用优化存在常见的陷阱吗?

1
Python:为什么*和**比/和sqrt()快?
在优化代码时,我意识到了以下几点: >>> from timeit import Timer as T >>> T(lambda : 1234567890 / 4.0).repeat() [0.22256922721862793, 0.20560789108276367, 0.20530295372009277] >>> from __future__ import division >>> T(lambda : 1234567890 / 4).repeat() [0.14969301223754883, 0.14155197143554688, 0.14141488075256348] >>> T(lambda : 1234567890 * 0.25).repeat() [0.13619112968444824, 0.1281130313873291, 0.12830305099487305] 并且: >>> from math import sqrt >>> T(lambda : sqrt(1234567890)).repeat() …

6
为什么C中的此逻辑AND版本没有显示短路行为?
是的,这是一个家庭作业问题,但是我已经完成了我的研究并且对这个主题进行了大量的深入思考,无法解决。问题指出,这段代码没有表现出短路行为,并询问原因。但是在我看来,它确实表现出短路行为,所以有人可以解释为什么不这样做吗? 在C中: int sc_and(int a, int b) { return a ? b : 0; } 在我看来,在a错误的情况下,该程序根本不会尝试评估b,但我一定是错的。b在这种情况下,为什么程序在不需要的情况下甚至可以触摸?


16
头文件和库之间有什么区别?
我很难理解的一件事是编译器如何工作。我遇到很多困难,但是特别是我一直在混淆头文件和库。如果有人可以解决问题,那就太好了。
80 c++  c 

3
为什么GCC垫可与NOP一起使用?
我已经使用C了很短的时间,最近才开始涉足ASM。当我编译程序时: int main(void) { int a = 0; a += 1; return 0; } objdump反汇编具有代码,但在重新输入后会提示: ... 08048394 <main>: 8048394: 55 push %ebp 8048395: 89 e5 mov %esp,%ebp 8048397: 83 ec 10 sub $0x10,%esp 804839a: c7 45 fc 00 00 00 00 movl $0x0,-0x4(%ebp) 80483a1: 83 45 fc 01 addl $0x1,-0x4(%ebp) …
80 c  gcc  assembly 

12
如何避免使用getchar()按下Enter键仅读取单个字符?
在下面的代码中: #include <stdio.h> int main(void) { int c; while ((c=getchar())!= EOF) putchar(c); return 0; } 我必须按Enter来打印输入的所有字母getchar,但是我不想这样做,我要做的是按字母,然后立即看到我介绍的字母重复,而无需按Enter。例如,如果我按字母“ a”,我想在其旁边看到另一个“ a”,依此类推: aabbccddeeff..... 但是,当我按“ a”时,什么也没发生,我可以写其他字母,并且只有在按Enter以下命令时,副本才会出现: abcdef abcdef 我怎样才能做到这一点? 我cc -o example example.c正在Ubuntu下使用命令进行编译。


7
malloc用于C中的结构和指针
假设我想定义一个表示向量长度及其值的结构,如下所示: struct Vector{ double* x; int n; }; 现在,假设我要定义向量y并为其分配内存。 struct Vector *y = (struct Vector*)malloc(sizeof(struct Vector)); 我在互联网上的搜索显示我应该分别为x分配内存。 y->x = (double*)malloc(10*sizeof(double)); 但是,似乎我为y-> x分配了两次内存,一次是为y分配内存,另一次是为y-> x分配内存,这似乎浪费了内存。如果让我知道编译器的实际功能以及初始化y和y-> x的正确方法,将不胜感激。 提前致谢。

6
#ifdef里面#define
我正在尝试写这样的东西: #define COV_ON(x) \ #ifdef COVERAGE_TOOL \ _Pragma (COVERAGE #x) #endif 有什么办法可以这样定义COV_ON吗?我知道我在上面所做的事情是错误的,因为我无法#ifdef在#define中使用。(#不允许使用#define)。那有什么解决办法吗?
80 c  c-preprocessor 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.