Tag: 内存管理

读进程写的最佳缓冲区大小

在我的函数中,我需要将文件中的一些数据读入缓冲区,操作数据并将其写回另一个文件。 该文件大小未知,可能非常大。 如果我使用一个小缓冲区,将会有一个很长的读/写周期,这将花费很多时间。 相反,长缓冲区意味着我需要消耗更多内存。 我应该使用的最佳缓冲区大小是多少? 这种情况是依赖的吗? 我在Windows中看到了一些像Tera copy这样的应用程序,可以高效地管理大量文件。 我应该注意其他任何技术或机制吗? 注意:此程序将在Windows下运行。

堆栈和堆中的内存分配

这似乎是一个非常基本的问题,但它一直在我脑海中: 当我们分配一个局部变量时,它会进入堆栈。 类似地,动态分配会导致变量进入堆。 现在,我的问题是,这个变量实际上是在堆栈还是堆上,或者我们只是堆栈和堆中的引用。 例如, 假设我声明了一个变量int i 。 现在这个i被分配在堆栈上。 那么,当我打印i的地址时,这将是堆栈中的一个位置? 堆的问题也一样。

在realloc()之前需要malloc()吗?

因为我读过realloc将作为malloc,如果指向的大小是0,我使用它没有malloc(),只要指针是静态的,全局的,或者如果是自动的话显式设置为NULL。 但是,我注意到很多程序员试图设置它或将其设置为malloc(1)。 需要它吗?

嵌入式应用程序中的内存管理资源

我应该如何管理关键任务嵌入式应用程序中的内存? 我在谷歌发现了一些文章,但无法确定一个非常有用的实用指南。 DO-178b禁止动态内存分配,但是如何管理内存呢? 提前预先分配所有内容并发送指向需要分配的每个function的指针? 在堆栈上分配它? 使用全局静态分配器(但它与动态分配非常相似)? 例如,答案可以是常规答案,对资源的引用或对良好的开源嵌入式系统的引用。 澄清:这里的问题不在于内存管理是否适用于嵌入式系统。 但是什么是嵌入式系统的优秀设计,以最大限度地提高可靠性。 我不明白为什么静态预分配缓冲池,并动态地获取和删除它,与动态分配内存不同。

如何在C中实现可变长度的’string’-y

我已经google了很多,但我找不到有关如何在高级语言中实现可变长度字符串的信息。 我正在创建自己的这种语言,我不知道从哪里开始使用字符串。 我有一个描述string类型的结构,然后是一个分配这样一个’字符串’的create函数: /* A safer `strcpy()`, using `strncpy()` and `sizeof()` */ #define STRCPY(TO, FROM) \ strncpy(TO, FROM, sizeof(TO)); TO[sizeof(TO) – 1] = ‘\0’ struct string { // … char native[1024]; }; string String__create(char native[]) { string this = malloc(sizeof(struct string)); // … STRCPY(this->native, native); return this; } 但是,这只允许1kb长的字符串。 这有点愚蠢,在大多数情况下会浪费大量内存。 鉴于我必须以某种方式声明要使用的内存…我如何实现一个能够(有效地)存储(有效)无限数量的字符的字符串?

为什么malloc()或new永远不会返回NULL?

我正在编写一个应用程序,需要大量内存用于缓存目的,正如我在此描述的那样。 现在我正在玩一些malloc / new结构来弄清楚我是如何实现它的。 我做了一个奇怪的观察: #include #include int main(void) { while(1) { char *foo = (char*)malloc(1024);// new char[1024]; if(foo == NULL) { printf(“Couldn’t alloc\n”); fflush(stdout); return 0; } } return 0; } 为什么永远不会达到printf? 如果我的系统内存不足,则称malloc返回NULL,如此处所述。 但我总是收到SIGKILL(我正在使用linux ……)。

c中的动态与静态数组

以下代码使用malloc函数创建一个数组。 但我知道只需int array [size]就可以做得更简单。 我认为这是静态数组。 但是用malloc函数是动态数组吗? 我在网上发现了这个代码……真正发生了什么,以及静态数组和动态数组(以及堆内存之间的静态内存)之间的区别。 你可以在运行时更改动态数组的大小吗? 或者…我完全不知道…如果有人能解释我会很感激:) #include #include #include int main(void) { int size; int i; printf(“Choose size of array: “); scanf(“%d”,&size); /*—MALLOC/FREE—*/ int *m_array = (int *)malloc((size+1)*sizeof(int)); memset(m_array,’\0′,size+1); for(i=0; i<size ; i++) { m_array[i]=i; printf("%d ",m_array[i]); } printf("\n"); free(m_array); return 0; }

如何在C中声明和使用10亿个整数的庞大数组?

我正在实现一个顺序程序,用于像quicksort一样进行排序。 我想用大量的1或10亿个整数来测试我的程序的性能。 但问题是由于数组的大小,我得到了分段错误。 此数组声明的示例代码: #include #include #include #define N 1000000000 int main(int argc, char **argv) { int list[N], i; srand(time(NULL)); for(i=0; i<N; i++) list[i] = rand()%1000; return 0; } 我有一个使用mmap函数的命题。 但我不知道如何使用它? 任何人都可以帮我使用它吗? 我正在研究Ubuntu 10.04 64位,gcc 4.4.3版。 谢谢你的回复。

mmap vs sbrk,性能比较

这些电话中的哪一个平均更快? 我听说mmap对于较小的分配来说速度更快,但我还没有听到过比较。 任何有关这些表现的信息都会很好。

将动态分配的内存从C ++返回到C.

我有一个必须可以从C等使用的DLL,所以我不能正常使用字符串对象等,但我不知道如何安全地做到这一点.. const char *GetString() { std::stringstream ss; ss << "The random number is: " << rand(); return ss.str().c_str(); } 当ss从堆栈上掉下来时,c字符串会被破坏吗? 我这么假装…… 另一种选择可能是在堆上创建一个新的字符串,但是要解除分配的是什么? const char *GetString() { std::stringstream ss; ss << "The random number is: " << rand(); char *out = new char[ss.str().size()]; strcpy(ss.str().c_str(), out); return out;//is out ever deleted? } 指向其他东西以及字符串的指针也是如此。