Questions tagged «c»

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

11
整数最大值
在C中,整数(对于32位计算机)为32位,范围为-32,768至+32,767。在Java中,整数(long)也是32位,但范围为-2,147,483,648至+2,147,483,647。 即使位数相同,我也无法理解Java中的范围如何不同。有人可以解释吗?
290 java  c  integer  max  bit 

19
在C / C ++中检测多余的#include?
我经常发现文件的标头部分一直都在变大,但从未变小。在源文件的整个生命周期中,类可能已经移动并被重构,并且很可能有很多#includes不需要再存在了。将它们保留在那里只会延长编译时间,并增加不必要的编译依赖项。试图弄清仍然需要哪些可能会很乏味。 是否有某种工具可以检测到多余的#include指令并建议可以安全删除的指令? 皮棉可以这样做吗?



10
C / C ++包含头文件的顺序
应该指定包含文件的顺序,即,为什么在一个头之前包含一个头的原因是什么? 例如,系统文件,STL和Boost是否在本地包含文件之前或之后?
287 c++  c 

8
为什么要快速运行glibc的复杂性太复杂?
我在这里浏览strlen代码,想知道是否确实需要代码中使用的优化?例如,为什么下面这样的东西不能同样好或更好? unsigned long strlen(char s[]) { unsigned long i; for (i = 0; s[i] != '\0'; i++) continue; return i; } 较简单的代码对编译器进行优化是否更好或更容易? strlen链接后面页面上的代码如下所示: /* Copyright (C) 1991, 1993, 1997, 2000, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Written by Torbjorn Granlund (tege@sics.se), with …


20
用C或C ++编写Android应用程序?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我正在尝试将游戏开发/移植到Android,但是它是用C语言编写的,并且Android支持Java,但是我敢肯定,一定有一种方法可以在其中安装C应用程序,任何人都知道实现此目的的方法吗?
286 c++  c  android 

12
在Python中包装C库:C,Cython或ctypes?
我想从Python应用程序调用C库。我不想包装整个API,只包装与我的情况相关的函数和数据类型。如我所见,我有三个选择: 在C中创建一个实际的扩展模块。可能有点过头了,我还想避免学习扩展编写的开销。 使用Cython将C库的相关部分公开给Python。 使用Python ctypes与外部库进行通信,从而完成整个工作。 我不确定2)还是3)是更好的选择。3)的优点是它ctypes是标准库的一部分,并且生成的代码将是纯Python –尽管我不确定该优点实际上有多大。 两种选择都有其他优点/缺点吗?您推荐哪种方法? 编辑:感谢您的所有答复,它们为希望做类似事情的任何人提供了很好的资源。当然,仍需针对单个案例做出决定-没有人会回答“这是对的”。就我自己而言,我可能会使用ctypes,但我也期待在其他项目中试用Cython。 由于没有一个单一的真实答案,因此接受一个答案有点武断。我选择了FogleBird的答案,因为它提供了对ctypes的一些很好的了解,并且它也是当前投票最高的答案。但是,我建议您阅读所有答案以获得一个很好的概述。 再次感谢。
284 python  c  ctypes  cython 

18
空终止字符串的基本原理是什么?
尽管我热爱C和C ++,但我还是忍不住选择以null结尾的字符串: 在C之前存在长度前缀(即Pascal)的字符串 长度前缀的字符串允许进行恒定的时间长度查找,从而使几种算法更快。 前缀字符串的长度使导致缓冲区溢出错误更加困难。 即使在32位计算机上,如果允许字符串成为可用内存的大小,则带前缀前缀的字符串也只比以空终止的字符串宽3个字节。在16位计算机上,这是一个字节。在64位计算机上,4GB是一个合理的字符串长度限制,但是即使您希望将其扩展为机器字的大小,64位计算机通常也具有足够的内存,使得多余的7个字节属于null参数。我知道原始的C标准是为极差的机器(就内存而言)编写的,但是效率论点在这里并没有卖给我。 几乎所有其他语言(例如Perl,Pascal,Python,Java,C#等)都使用长度前缀的字符串。这些语言通常在字符串操作基准中胜过C,因为它们在使用字符串时效率更高。 C ++使用std::basic_string模板对此进行了一些纠正,但是期望以null终止的字符串的纯字符数组仍然很普遍。这也是不完美的,因为它需要堆分配。 空终止的字符串必须保留一个字符(即null),该字符不能存在于字符串中,而长度前缀的字符串可以包含嵌入的null。 这些事情中,有几件事比C揭露的要新,因此C不必了解它们是有道理的。但是,在C出现之前,有几个很简单。为什么会选择空终止的字符串而不是明显更好的长度前缀? 编辑:由于上面我的效率问题上有人问了一些事实(并且不喜欢我已经提供的事实),因此它们源于以下几点: 使用空终止字符串的Concat需要O(n + m)的时间复杂度。长度前缀通常只需要O(m)。 使用空终止字符串的长度要求O(n)时间复杂度。长度前缀为O(1)。 长度和concat是迄今为止最常见的字符串操作。在几种情况下,以null终止的字符串可能更有效,但这种情况发生的频率要少得多。 从以下答案中可以看出,在某些情况下以null终止的字符串更有效: 当您需要切断字符串的开头并将其传递给某种方法时。即使允许销毁原始字符串,也不能真正在恒定时间内使用长度前缀来完成此操作,因为长度前缀可能需要遵循对齐规则。 在某些情况下,您只是逐个字符地遍历字符串,则可以保存CPU寄存器。请注意,这仅在您没有动态分配字符串的情况下才有效(因为您必须释放它,必须使用保存的CPU寄存器保存最初从malloc和friends获得的指针)。 以上都不是最常见的长度和连贯性。 下面的答案中还有一个断言: 您需要切断字符串的结尾 但这是不正确的-空终止和长度为前缀的字符串的时间相同。(以NULL结尾的字符串只是在您希望新的结尾处保留一个NULL,长度前缀只是从前缀中减去。)
281 c++  c  string  null-terminated 

4
从前,当>快于<…时,等等?
我正在阅读一个很棒的OpenGL教程。真的很好,相信我。我当前所在的主题是Z缓冲区。除了解释全部内容之外,作者还提到我们可以执行自定义深度测试,例如GL_LESS,GL_ALWAYS等。他还解释了深度值的实际含义(最高和最低)也可以是定制。到目前为止我还了解。然后作者说了一些难以置信的话: zNear范围可以大于zFar范围;如果是这样,那么就构成距观看者最近或最远的位置而言,窗口空间值将反转。 此前,有人说窗口空间Z值0最接近,而1最远。但是,如果我们的剪辑空间Z值被取反,则深度1将最接近视图,深度0将最远。但是,如果翻转深度测试的方向(GL_LESS到GL_GREATER等),我们将得到完全相同的结果。因此,这实际上只是一个约定。确实,翻转Z的符号和深度测试曾经是许多游戏中至关重要的性能优化。 如果我正确理解,从性能角度来看,翻转Z的符号和深度测试仅是将&lt;比较更改为比较而已&gt;。因此,如果我理解正确,而作者并没有在撒谎或编造东西,那么更改&lt;为&gt;过去对于许多游戏来说都是至关重要的优化。 作者是在编造东西吗,我是在误解某些东西,还是真的曾经比&lt;他慢(如作者所说,生命至关重要)&gt;? 感谢您澄清这个非常奇怪的问题! 免责声明:我完全知道算法复杂性是优化的主要来源。此外,我怀疑现在绝对不会有任何改变,我不是要优化它。我只是极度,痛苦,甚至是好奇。
280 c  optimization  opengl  cpu  gpu 



6
什么时候应该使用mmap进行文件访问?
POSIX环境至少提供两种访问文件的方式。有标准的系统调用open(),read(),write(),和朋友,但也有使用的选项mmap(),将文件映射到虚拟内存。 什么时候比另一种更好?包括两个接口,它们各自的优点是什么?
276 c  file-io  posix  mmap 

13
malloc()和free()如何工作?
我想知道如何malloc和free工作。 int main() { unsigned char *p = (unsigned char*)malloc(4*sizeof(unsigned char)); memset(p,0,4); strcpy((char*)p,"abcdabcd"); // **deliberately storing 8bytes** cout &lt;&lt; p; free(p); // Obvious Crash, but I need how it works and why crash. cout &lt;&lt; p; return 0; } 如果可能的话,我很感激如果答案在内存级别。

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.