Questions tagged «c»

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

9
从C ++迁移到C
用C ++编码几年后,最近在嵌入式领域为我提供了C语言的作业编码。 抛开在嵌入式领域解雇C ++是对还是错的问题,C ++有一些功能/习惯用法,我会想念很多。仅举几个: 通用的类型安全的数据结构(使用模板)。 RAII。特别是在具有多个返回点的函数中,例如,不必记住在每个返回点上释放互斥量。 析构函数一般。即,您为MyClass编写了一次d'tor,然后,如果MyClass实例是MyOtherClass的成员,则MyOtherClass不必显式取消初始化MyClass实例-它的d'tor会自动调用。 命名空间。 从C ++到C的经历是什么? 您为自己喜欢的C ++功能/习惯找到了哪些C替代品?您是否发现了希望C ++具有的C功能?
83 c++  c 

5
“ pragma”一词从何而来?
所以我知道什么是杂用语,它的用途是什么,但是单词本身的含义是什么?我已经在代码中使用了很多次,但我从未真正知道这个词的实际含义或代表什么。
83 c++  c  terminology  pragma 

1
C代码循环性能[续]
这个问题在我的问题上继续(根据Mystical的建议): C代码循环性能 继续我的问题,当我使用打包指令而不是标量指令时,使用内在函数的代码将非常相似: for(int i=0; i<size; i+=16) { y1 = _mm_load_ps(output[i]); … y4 = _mm_load_ps(output[i+12]); for(k=0; k<ksize; k++){ for(l=0; l<ksize; l++){ w = _mm_set_ps1(weight[i+k+l]); x1 = _mm_load_ps(input[i+k+l]); y1 = _mm_add_ps(y1,_mm_mul_ps(w,x1)); … x4 = _mm_load_ps(input[i+k+l+12]); y4 = _mm_add_ps(y4,_mm_mul_ps(w,x4)); } } _mm_store_ps(&output[i],y1); … _mm_store_ps(&output[i+12],y4); } 尽管我希望它是标量版本性能的4倍,即每个周期4.1,6 = 6,4 FP ops,但该内核的测量性能约为每个周期5.6个FP操作。 考虑到权重因子的移动(感谢指出),时间表如下: 看起来时间表没有改变,尽管在操作之后还有一条额外的指令movss将标量权重值移动到XMM寄存器,然后用于shufps将该标量值复制到整个向量中。mulps考虑到从负载到浮点域的切换延迟,权重向量似乎已准备就绪,可以及时使用,因此不会引起任何额外的延迟。 …

9
x << 1或x << 10哪个更快?
我发誓,我不想优化任何事情,我只是出于好奇而问这个问题。我知道,在大多数硬件有位移(例如的组件的命令shl,shr),它是一个命令。但这有多少关系(纳秒级或CPU精巧度)重要?换句话说,以下任一处理器在任何CPU上的运行速度都更快吗? x &lt;&lt; 1; 和 x &lt;&lt; 10; 而且请不要讨厌我这个问题。:)
83 c++  c  performance  cpu  low-level 

3
为什么CUDA固定内存这么快?
当我使用固定内存进行CUDA数据传输时,我观察到数据传输速度大大提高。在linux上,实现此目标的底层系统调用是mlock。从mlock的手册页中可以看出,锁定该页可防止将其换出: mlock()将页面锁定在地址范围内,该地址范围从addr开始并持续len个字节。当调用成功返回时,保证所有包含指定地址范围一部分的页面都驻留在RAM中; 在测试中,我的系统上有几千个可用内存,因此从没有任何风险可以换出内存页面,但我仍然观察到加速。任何人都可以解释这里到底发生了什么吗?任何见解或信息都将不胜感激。
83 c++  c  linux  cuda 

10
为什么要使用strncpy而不是strcpy?
编辑:我已经为示例添加了源。 我遇到了这个例子: char source[MAX] = "123456789"; char source1[MAX] = "123456789"; char destination[MAX] = "abcdefg"; char destination1[MAX] = "abcdefg"; char *return_string; int index = 5; /* This is how strcpy works */ printf("destination is originally = '%s'\n", destination); return_string = strcpy(destination, source); printf("after strcpy, dest becomes '%s'\n\n", destination); /* This is …

12
如何获得我的C代码以自动打印出其Git版本哈希?
有没有简单的方法可以编写可以访问其Git版本哈希的C代码? 我用C语言编写了用于在实验室环境中收集科学数据的软件。我的代码将它收集的数据记录在.yaml文件中,以供以后分析。我的实验每天都在变化,因此我经常不得不修改代码。为了跟踪修订,我使用git存储库。 我希望能够在我的.yaml数据文件中包含Git修订哈希作为注释。这样,我可以查看.yaml文件,确切地知道使用什么代码生成该文件中显示的数据。有没有简单的方法可以自动执行此操作?

13
如何清空char数组?
具有像char成员[255]这样的char数组。如何不使用循环将其完全清空? char members[255]; “空”的意思是,如果其中存储了一些值,则应该没有。例如,如果我执行strcat,则旧值不应保留 members = "old value"; //empty it efficiently strcat(members,"new"); // should return only new and not "old value new"
83 c  arrays  char 

7
如何将可变数量的参数传递给printf / sprintf
我有一个类,其中包含一个“错误”函数,该函数将格式化某些文本。我想接受可变数量的参数,然后使用printf格式化它们。 例: class MyClass { public: void Error(const char* format, ...); }; Error方法应该接受参数,调用printf / sprintf对其进行格式化,然后对其进行处理。我不想自己写所有格式,因此尝试弄清楚如何使用现有格式很有意义。


4
表面和纹理之间的差异(SDL /常规)
谁能用简单的词向我解释纹理和表面之间的区别是什么?我看到它用在SDL2asSDL_Surface和中SDL_Texture。SDL_Texture从中SDL_Surface创建图像,然后从图像/位图中创建图像。两者都是像素的集合。但是我看不到它们之间的主要区别(是否需要对GPU进行处理?) 我试图用Google搜索它,但是我发现的所有解释都太复杂了,以至于无法理解它们而又不深入研究计算机图形学的东西。
83 c  graphics  sdl  sdl-2 

5
是什么原因导致管道破裂错误?
我知道关闭对等端的套接字时会引发管道破裂错误。 但是,在我的测试中,我注意到,当对等端关闭时,在此端立即进行“发送”调用并不总是会导致管道错误。 例如: 关闭对等端的套接字后(我尝试通过调用close进行干净关闭,也通过杀死对等体来异常关闭),如果我尝试发送40个字节,则管道不会断开,但是,如果我尝试发送40000字节,则立即给出管道中断错误。 究竟是什么原因导致管道破裂,并且可以预测其行为?
83 c  broken-pipe 


3
为什么将自由的返回值转换为无效?
我正在读一本使用C 的书(Butenhof的《使用POSIX线程编程》,1997年),并且遇到了以下问题: (void)free(data); 这data只是指向已分配结构的指针, data = malloc(sizeof(my_struct_t)); 为什么free被强制转换为void? 从我对C的理解来看,这似乎没有任何意义,原因有两个: 自由功能已经返回 void 该代码未使用返回值(甚至未分配给变量) 这本书写于1997年。这是某种遗留的东西吗? 作者提到这些示例是在Digital Unix 4.0d上运行的,但是如果您不打算使用该结果,我仍然无法想象有理由使用函数的结果。
82 c  casting  free  void  legacy-code 

10
在主函数中重命名argc和argv是否安全?
许多程序使用标准名称来表示许多参数和字符串数组。主要功能外观的原型,如:int main(int argc, char *argv[]);。但是,如果我为这些变量选择自定义名称,我会破坏某些东西吗? 例如 int main(int n_of_args, char *args[]); 在编译器的上下文中,一切都很好。这些变量是main函数的局部变量,因此可以有任何名称。而且简单的代码可以完美地构建和运行。但是这些名称可以由预处理器使用。因此,重命名这些参数是否安全? PS我个人觉得这些名字不好,因为它们看起来很相似,只有一个字母不同。但是每个人出于某种原因使用它们。
82 c++  c  main 

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.