Tag: 内存管理

在C中分配内存的问题

编辑2 在我的其他SO问题中找到有关此问题的更多信息。 编辑1 我已经刷新了这篇文章,因此内容可能与Alexey,Hicham,Jonathan和Mat的评论不一致。 以下代码使用此FFT来辅助起始检测。 当一次调用该方法时, 一切正常 ,我得到一个很好的值记录。 当第二次调用这个方法时,我得到了nan或者垃圾。 有任何想法吗? { NSLog(@”Running onset.”); NSMutableArray *mutableArrayOfFlags = [[NSMutableArray alloc] init]; OnsetsDS *ods = malloc(sizeof *ods); float* odsdata = (float*) malloc(onsetsds_memneeded(ODS_ODF_RCOMPLEX, 512, 11)); onsetsds_init(ods, odsdata, ODS_FFT_FFTW3_HC, ODS_ODF_RCOMPLEX, 512, 11, 44100); int i; int x; bool onset; for (i = 0; i < vocalBuffer.numFrames; i=i+512){ // convert vocal […]

如何最小化struct-type的内存使用?

对于Connect Four游戏的转置表(通常是哈希表),我想有效地使用内存(以存储尽可能多的元素)。 一个表元素必须存储以下信息: 锁:无符号64位 移动:[0..6] – >无符号3位 得分:[ – 2000..2000] – >签名12位 flag:VALID,UBOUND,LBOUND: – > unsigned 2 bit 高度:[ – 1..42]: – >签名7位 首先我尝试了以下数据结构,需要24个字节: struct TableEntry1 { unsigned __int64 lock; unsigned char move; short score; enum { VALID, UBOUND, LBOUND } flag; char height; }; 重新排列元素后,它需要16个字节(我找到了这种行为的答案 ): struct TableEntry2 { unsigned __int64 lock; enum { […]

在OS X上保留内存

在OS X中,Windows的VirtualAlloc相当于什么? 也就是说,如何保留一个连续的地址空间而不实际提交它,然后再提交它的块? 谢谢, 亚历克斯

data / bss / heap和stack中的内存分配

我有以下代码: #include int global_var; int global_initialized_var=5; void function(){ int stack_var; printf(“The function’s stack_var is at address 0x%08x\n”, &stack_var); } int main(){ int stack_var; static int static_initialized_var = 5; static int static_var; int *heap_var_ptr; heap_var_ptr = (int *) malloc(4); // Next variables will be at data segment printf(“global_initialized_var is at address 0x%08x\n”, &global_initialized_var); printf(“static_initialized_var is at […]

伙伴分配算法 – 开始堆地址

我目前正在尝试实现计算机程序设计Vol:1中描述的Buddy Allocator ,它利用了给定数据块及其相应伙伴的地址中的重要不变量。 计算如下…… BUDDY(X): X + 2^i if x mod 2^i+1 = 0 X – 2^i if x mod 2^i-1 = 0 Where X is the address of the block; i is the current order 让伙伴系统表现得如此之好的原因在于,找到伙伴地址的这种计算可以简单地通过第i个顺序位的翻转来执行(通过用1 << i进行xor'ing)。 如果给出左块地址,则返回右块。 如果给出正确的块,则返回左侧块。 但是,此方法假定堆以地址0开头。如果堆开始的地址位于i顺序范围内的位有一个,则执行上述计算将不会为您提供其伙伴的正确地址。 因此,简单地说,有没有办法推广这个计算,以便它可以在任何起始堆地址执行? 假设有一个最大订单的约束。 IE *如果最大订单是18,我们不会尝试执行任何大于或等于18的计算,因此您不需要找到它的伙伴。 对此非常感谢的任何帮助或建议!

指针数组与元素数组

今天早上我和同事就这个话题进行了讨论。 他说,将数组分配为指针数组总是更好,因为分别分配每个元素有更好的机会获得一个空闲的内存块。 有人这样想: // Consider n_elements as a dynamic value int n_elements = 10, i; int **ary = (int **) malloc(sizeof(int *) * n_elements); for(i = 0; i < n_elements; i++) { ary[i] = (int *) malloc(sizeof(int)); } 与他的方法相反,我认为分配元素数组更好,只是因为你会获得一个紧凑的内存块而不是遍布堆的一堆引用。 像这样的东西: int n_elements = 10; int *ary = (int *) malloc(sizeof(int) * n_elements); ary[0] = 100; […]

openssl:减少内存使用量

美好的一天。 我们有一个用C ++编写的服务器,它接受许多SSL / TLS连接; 我们正在使用boost :: asio(所以后端是openssl )来建立SSL。 在服务器上,每个连接使用大约160-200k字节的内存,我们希望减少这种使用。 boost :: asio默认使用SSL_MODE_RELEASE_BUFFERS标志,因此基本优化已经完成。使用ctx->freelist_max_len似乎没有任何改变。 怎么做到这一点? 也许我们还有一个额外的“秘密设置”? 可能我们可以安全地禁用一些加密算法来减少内存消耗?

为什么我没有堆栈溢出?

编辑在你兴奋之前看到最后的重要编辑,如果你仍然好奇,这些报告为: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=696222 http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=696263 我一直在尝试一段代码,并惊讶地发现我没有得到堆栈溢出。 试图简化我甚至得到的东西: #include int main() { int i; /* 1,500,000,000 x 4 bytes = 6,000,000,000 bytes = 6GB */ int size = 1500000000; int arr[size]; for (i = 0; i < size; i++) { arr[i] = 1; } printf("first: %d\n", arr[0]); printf("last: %d\n", arr[size – 1]); return 0; } 这使我怀疑我甚至不知道内存管理的基础知识。 我认为arr[size]应该在堆栈上轻松分配并且很容易溢出,而是它使用我所有的内存并交换并成功完成。 我错过了什么? […]

C C ++中内存泄漏的原因

C C ++中内存泄漏的原因是什么(除了通常分配内存而忘记解除分配内存)

Delphi和C / C ++ DLL Struct vs.Record

我之前问了一个关于delphi和C / C ++ DLL的问题。 我现在有另一个关于记录/结构的问题。 DLL应该能够动态地从MainAPP更改指针变量的VALUE。 我的delphi MAINAPP有以下记录: type MyRec = record MyInteger : Pointer; MyWideString : pwidechar; MyString : pchar; MyBool : Pointer end; type TMyFunc = function ( p : pointer ): pointer; stdcall; procedure test; var MyFunction : TMyFunc; TheRecord : MyRec; AnInteger : Integer; AWideString : WideString; AString : String; […]