Tag: 内存

Lua:垃圾收集+ userdata

假设以下情况: typedef struct rgb_t {float r,g,b} rbg_t; // a function for allocating the rgb struct rgb_t* rgb(r,g,b) { rgb_t* c = malloc(sizeof(rgb_t)); c->r=r; c->g=g; c->b=b; return c; } // expose rgb creation to lua int L_rgb (lua_State* L) { rgb_t** ud = (rgb_t **) lua_newuserdata(L, sizeof(rgb_t *)); *ud = rgb(lua_tonumber(L,1),lua_tonumber(L,2),lua_tonumber(L,3)); return 1; } 当从Lua调用L_rgb函数时,会发生两次分配。 Lua分配新的userdata并为结构分配rgb构造函数。 […]

C程序的内存分析

需要对我的C应用程序进行内存分析.. 它应该包括占用空间大小和RAM大小…… 例如,如果我的应用程序如下所示.. #include int global = 10; /* initialized global variable */ int test_code(void) { static int i = 100; /* Initialized static variable*/ return 0; } 输出: [putta@linux]$ gcc memory-layout.c -c memory-layout [putta@linux]$ ls -ltrh memory-layout.o 760 Nov 9 18:26 memory-layout [putta@linux]$ size memory-layout.o text data bss dec hex filename 67 8 0 […]

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

我目前正在尝试实现计算机程序设计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的计算,因此您不需要找到它的伙伴。 对此非常感谢的任何帮助或建议!

Malloc分配方案

是的,我正在参加计算机系统课程。 我有几个关于实现malloc的各种分配方案的问题。 对于显式列表,如果我使用类似LIFO的堆栈实现malloc,那么指向前一个释放内存的目的究竟是什么? 就像为什么你需要双链表? 不会单独链接列表工作吗? Malloc讲座。 我在网上找到了这个链接,你可以看看幻灯片7,看看我在说什么。 在查看隔离列表分配方案时,这些列表是单向的吗? 而且,合并机制究竟是什么? 例如,如果释放了4个单词,您是否会首先尝试在您将自由空间插入相应的隔离链表之前加入它? 或者您只是在相应的隔离链表的“4个字”部分中插入4个字块? 谢谢。

带有数组的C struct的内存布局

假设我有一个C结构定义如下: typedef struct { double array1[2]; } struct0_T; 记忆是如何布局的? struct只能保持一个指针或两个双打的值吗? 在我认为struct有一个指针之前,但今天我发现(令我惊讶的是)值存储在那里。 它在不同的编译器之间有所不同吗?

openssl:减少内存使用量

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

未初始化的内存用于调试的常见值是什么?

很久以前我学会了用0xDEADBEEF填充未使用/未初始化的内存,以便在调试器或崩溃报告中,如果我看到该值,我知道我正在查看未初始化的内存。 我从崩溃报告中看到iOS使用0xBBADBEEF 。 人们使用了哪些其他创造性价值观? 任何特定的价值观都有任何特定的好处吗? 变成单词的价值最明显的好处是,至少在大多数人中,如果单词是用他们的语言,那么他们很容易突出,因为某些严格的数值不太可能突出。 但是,也许有其他理由选择数字? 例如,奇数可能会使处理器(68000)崩溃,例如在某些内存访问时崩溃,因此最好选择0x0BADBEEF超过0xBADBEEF0 。 他们的任何其他值(可能是处理器特定的)是否具有使用未初始化内存的具体好处?

为什么我没有堆栈溢出?

编辑在你兴奋之前看到最后的重要编辑,如果你仍然好奇,这些报告为: 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 ++为我的VM编写一个内存管理器。 好吧,更确切地说,VM指令将被编译成带有嵌入式内存管理器的C ++。 我在处理C方面感觉更舒服,但现在我确实需要exception处理的原生支持,这几乎是我使用C ++的唯一原因。 C和C ++都有严格的别名规则,即两个不兼容类型的对象不应重叠,对于联合,C中有一个小的例外。 但是为了定义内存分配函数的行为,例如malloc , calloc , alloca等,C标准具有以下段落。 6.5-6访问其存储值的对象的有效类型是对象的声明类型(如果有)。 分配的对象没有声明的类型。 如果通过具有非字符类型的类型的左值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该值的后续访问的有效类型储值。 如果使用memcpy或memmove将值复制到没有声明类型的对象中,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是复制值的对象的有效类型(如果有)。 对于没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型。 这有效地使用原始分配的内存为任何类型在C中定义良好的行为。我试图在C ++标准文档中找到类似的段落,但找不到一个。 我认为C ++在这方面有不同的方法。 什么是C语言中“没有声明类型的已分配对象”的C ++等价物,C ++标准如何定义它?

如何释放函数返回的指针?

#include #include #include char* f(void) { char *x; x = malloc(sizeof(char) * 4); strcpy(x, “abc”); return(x); } int main(void) { char *a; a = f(); printf(“%s”, a); free(a); return(0); } 是否必须释放函数中的变量x ? 如果是这样,当我需要退货时,这怎么可能呢?