Tag: memory management

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’}; […]

Solaris 10上更好的内存(堆)管理

我通过Pro * C为嵌入式SQL for Oracle提供了c代码。 每当我进行插入或更新时(下面给出更新示例), update TBL1 set COL1 = :v, . . . where rowid = :v 为了管理批量插入和更新,我已经分配了几个内存块作为批量和提交一次插入。 在必要时,还会有其他内存分配。 如何更好地管理动态内存分配的内存(堆)? 一种选择是在GNU链接时间内配置堆大小。 我使用g ++版本2.95,我知道它是一个相当旧的版本,但必须使用它来传统。 由于可执行文件(在solaris 10上运行),obce内置,可以在具有不同资源的多个生产环境上运行,因此用于堆大小分配的单一大小适合可能不合适。 作为替代方案,需要一些机制,其中堆可以在需要时弹性地生长。 与Linux不同,我认为,Solaris没有过度分配内存的概念。 因此,如果没有剩余空间,则内存分配可能会因ENOMEM而失败。 什么可能是更好的策略,知道我们可以跨越危险级别,现在我们应该释放我们正在存储的块,以防这些是使用或传输内存块到oracle DB完成的情况下,如果这些仍然有待加载,最后解除分配。 您可以建议的任何策略?

从结构中的指针获取数据“读/写无效”

我试图在数组中执行循环缓冲区。 我将数据保存在结构中,并通过推送,弹出等方法管理它。程序或多或少具有function和行为符合预期,但是我在valgrind测试中遇到错误。 我无法找出我的代码有什么问题。 虽然看起来像我的结构中通过指针管理数据是关键问题。 如果有人能指出我正确的方向,我将非常感激,因为我现在真的迷失了。 这是我的结构的样子: typedef struct queue_t{ int* data; int* end; int* head; int* tail; int max_length; int cur_length; } queue_t; 以下是我管理缓冲区操作的方法: (注释代码产生与memcpy几乎相同的错误) int* increase(int* point, queue_t* queue){ if(point != queue->end){ point = point + sizeof(int*); return point; }else{ return queue->data; } } queue_t* create_queue(int capacity){ queue_t* fifo; fifo = malloc(sizeof(queue_t)); fifo->data = […]

我们可以重用已分配的内存

这是对这个问题的跟进。 在解释我的问题时,我声明分配的内存可以重用,因为它没有声明的类型,我被告知它是不正确的C. 这是一个说明问题的代码示例: #include #include #include #include struct Elt { int id; char name[32]; }; struct Elt2 { double val; char name[16]; }; static_assert(sizeof(struct Elt2) id, elt->name); struct Elt2 *elt2 = (void *) elt; // declares a new pointer to a shorter type memcpy(elt2, &actual2, sizeof(*elt2)); // effective type is now struct Elt2 printf(“elt2: %g […]

我应该如何为c-string char数组分配内存?

因此,在尝试学习如何在C ++中使用C-Strings时,我遇到了内存分配问题。 这里的想法是创建一个新的字符串格式(s1 + sep + s2)我正在使用的文本提供了标题,所以我不能改变它,但我遇到了试图设置大小的问题char str []。 我收到一个错误,说sLength不是常量,因此不能用于设置数组的大小。 我对C ++比较陌生,所以这是一个两部分问题。 这个策略实际上是为新arrays分配内存吗? 如果使用strlen(char *)无法获得常量值,如何正确设置数组大小? char* concatStrings(char* s1, char* s2, char sep){ int sLength = strlen(s1) + strlen(s2) + 3; //+1 for char sep +2 for \0 at end of string char *str = new char[sLength]; strcpy (str, s1); str [sLength(s1)] = sep; strcat (str, […]

exec()更改程序映像后malloc的内存会发生什么变化?

我知道当我在Linux中调用其中一个exec()系统调用时,它将使用新映像替换当前正在运行的进程。 因此,当我分叉一个新进程并运行exec() ,子进程将被替换为新进程。 我从堆中分配的内存会发生什么变化? 假设我想解析任意数量的命令并将其发送到exec() 。 为了保持这个任意数字,我可能不得不在某些时候分配内存,因为我认为我不能正确使用静态大小的数组,所以我可能会使用malloc()或类似的东西。 我需要保持这个内存分配,直到我调用exec() ,但exec()永远不会返回。 内存是否被操作系统回收?

free,dealloc,release和autorelease之间有什么区别?

有人可以解释free() , release , autorelease和dealloc之间的区别吗?