Tag: c

memcpy和memmove的意外性能

为什么memcpy在我的系统上执行速度比memmove慢? 从阅读其他SO问题,例如这个或这个给人的印象是memcpy应该比memmove更快,直观地说,这应该是这样。 毕竟,memcpy的检查次数较少,手册页也与他们所说的相符。 但是,在测量每个函数内部所花费的时间时,memmove会记住memcpy! 更重要的是,它似乎也超过了memset,当memset似乎可以从memcpy或memmove无法实现的优化中受益。 为什么会这样? 我的电脑上的结果(众多之一): [INFO] (ex23.c:151 func: main) Normal copy: 109092 [INFO] (ex23.c:198 func: main) memcpy: 66070 [INFO] (ex23.c:209 func: main) memmove: 53149 [INFO] (ex23.c:219 func: main) memset: 52451 用于提供此结果的代码: #include #include #include “dbg.h” // debugging macros #include int main(int argc, char *argv[]) { char from[10000] = {‘a’}; char to[10000] = {‘c’}; […]

使用const参数将参数传递给函数:它更快吗?

例如,考虑一下: int sum(int a, int b) { return a + b; } 与 int sum(const int a, const int b) { return a + b; } 第二种方法通常更快吗? C中的函数参数被复制并发送到函数,因此函数内部的更改不会影响原始值。 我的理由是,在上面的第二个sum ,编译器确定a和b在函数内部没有被修改,所以它可以只传递原始值而不先复制它们。 这就是为什么我认为第二个sum比第一个快。 但我真的不知道。 在上面sum的特定简单示例中,差异(如果有的话)应该是最小的。 编辑: sum例子只是为了说明我的观点。 我不认为在这个特定的例子中应该有很大的差异。 但我想知道在更复杂的情况下,编译器是否可以利用函数参数中的const修饰符来使函数更快。 我怀疑编译器总能确定参数是否在函数内被更改(因此我的第二个问题在下面); 因此我希望当它找到一个const修饰符时,它会做出与没有const修饰符时不同的东西。 问题:一般来说,当一个函数的参数是const时,函数会比它们不是时更快吗? 问题2:通常,C编译器(理论上)是否总能确定函数内是否更改了函数参数?

找出2d矩阵是否是另一个2d矩阵的子集

最近我参加了一个黑客马拉松,我开始了解一个试图在2d矩阵中找到网格forms的问题。一个模式可能是U,H和T,并将用3 * 3矩阵表示如果我想呈现H和U. +–+–+–+ +–+–+–+ |1 |0 |1 | |1 |0 |1 | +–+–+–+ +–+–+–+ |1 |1 |1 | –> H |1 |0 |1 | -> U +–+–+–+ +–+–+–+ |1 |0 |1 | |1 |1 |1 | +–+–+–+ +–+–+–+ 现在我需要将其搜索到10*10 matrix containing 0s and 1s最近也是唯一的解决方案我可以得到它的powershell算法O(n ^ 4)。在MATLAB和R等语言中有非常微妙的方法可以做到这一点但是不是在C,C ++中。 我尝试了很多在Google和SO上搜索这个解决方案。但我最接近的是这个SO POST ,它讨论了实现Rabin-Karp字符串搜索算法 。但是没有伪代码或任何post解释这个。可以任何人帮忙或者提供任何链接,pdf或一些逻辑来简化这个? 编辑 作为Eugene Sh。 […]

无效的渲染器SDL2

我正在查看代码,我无法找到无效渲染器问题的解决方案。 我是SDL2的初学者,我必须用纯C编写代码。我认为在我的代码中有更多的错误,但由于这个我不能进一步。 代码是波兰语的一半,所以如果你不能得到我可以重写这一点的地方。 在主要我尝试加载function“Odczyt_z_Pliku”时出现问题。 可能某个地方存在问题。 SDL_GetError()表示“无效的渲染器。 #include #include #include #pragma warning(disable : 4996) #define WYSOKOSC_EKRANU 768 #define SZEROKOSC_EKRANU 1024 typedef enum bool{ false,true }bool; typedef struct sTekstura { int wysokosc; int szerokosc; SDL_Texture *Tekstura; }sTekstura; void IniTekstury(sTekstura T) { T.wysokosc = 0; T.szerokosc = 0; T.Tekstura = NULL; } void free(sTekstura T) { //Free texture […]

使用printf(%x)为什么指针的值不同?

#include int main(void) { int *ptr; printf(“The Hex value of ptr is 0x%x”,ptr); printf(“The pointer value of ptr is %p”,ptr); } 输出有点不同,我不知道为什么 The Hex value of ptr is 0x24a77950 The pointer value of ptr is 0x7fff24a77950 它显示ptr的值是hex整数,但hex输出缺少部分7fff 。 这是printf格式问题还是别的什么?

在C中实现带有链表的堆栈

我在使用带有struct的链表实现Stack时遇到了麻烦。 程序编译很好,但是当我运行它时,它打印第一个元素,但然后将下一个节点作为NULL读取。 我认为将堆栈传递给push方法可能是一个错误但我不确定并且我没有成功修复它所以我在寻求你的帮助: #include #include struct stackNode{ char data; struct stackNode *nextPtr; }; typedef struct stackNode StackNode; typedef StackNode *StackNodePtr; void convertToPostfix(char infix[], char postfix[]); int isOperator(char c); int precedence(char operator1, char operator2); void push(StackNodePtr *topPtr, char value); char pop(StackNodePtr *topPtr); char stackTop(StackNodePtr topPtr); int isEmpty(StackNodePtr topPtr); void printStack(StackNodePtr topPtr); int main(){ convertToPostfix(NULL, NULL); return […]

Objective-C检查是否定义了Structs

我的iOS应用程序可以使用可选的外部第三方库。 我想到了使用这个答案( 弱链接 – 检查一个类是否存在并使用该类 )并在执行特定于此库的代码之前检测该类是否存在。 但是,我发现这个外部库不是作为Objective-C类编写的,而是作为C STRUTS和函数编写的。 是否有类似的技术可以让我检查C Strut或函数是否存在? 或者一些更好的替代方法,看看这个库是否在运行时存在?

从’void *’转换为指向非”’的指针需要显式转换(第17行)

我正在阅读“学习困难之路”一书,当我尝试运行此程序时,我收到以下错误消息: 从’void *’转换为指向非’void’的指针需要显式转换。 我不知道如何解决这个问题,我是否必须更改结构中的返回变量? 看看无论如何,这里的代码:(在Visual C ++ 2010上编译,还没有尝试过GCC)。 //learn c the hardway #include #include #include #include struct Person { char *name; int age; int height; int weight; }; struct Person *Person_create(char *name, int age, int height, int weight) { struct Person *who = malloc(sizeof(struct Person)); assert(who != NULL); who->name = strdup(name); who->age = age; who->height […]

C分段故障中的方程求解器

#include int main() { printf(“choose number”); c(); } c() { printf(“1. ax+b=0\n\n”); printf(“2. ax+by+c=0\n dx+ey+f=0\n\n”); int n; scanf(“%d”, &n); if (n > 3) wrong(); if (n == 1) formula1(); if (n == 2) formula2(); if (n == 3) ; formula3(); } wrong() { printf(“Please choose a number between 1 and 3.\n\n”); c(); } formula1() { […]

C中只有一次伪通用标头

在对通用向量进行了一些工作后,我询问了这个问题 ,我想知道是否有任何方法可以检查每个类型的库的每个实例只进行一次。 这是当前头文件的样子: #ifndef VECTOR_GENERIC_MACROS #define VECTOR_GENERIC_MACROS #ifndef TOKENPASTE #define TOKENPASTE(a, b) a ## b #endif #define vector_t(T) TOKENPASTE(vector_t_, T) #define vector_at(T) TOKENPASTE(*vector_at_, T) #define vector_init(T) TOKENPASTE(vector_init_, T) #define vector_destroy(T) TOKENPASTE(vector_destroy_, T) #define vector_new(T) TOKENPASTE(vector_new_, T) #define vector_delete(T) TOKENPASTE(vector_delete_, T) #define vector_push_back(T) TOKENPASTE(vector_push_back_, T) #define vector_pop_back(T) TOKENPASTE(vector_pop_back_, T) #define vector_resize(T) TOKENPASTE(vector_resize_, T) #define vector_reserve(T) TOKENPASTE(vector_reserve_, […]