Tag: memory

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完成的情况下,如果这些仍然有待加载,最后解除分配。 您可以建议的任何策略?

使用fread()和fseek()在C中读取文件的一部分

我正在尝试将文件读入缓冲区,块大小为BLOCK_SIZE (当前等于1000 unsigned chars )。 我的代码最初找到了为了读取整个文件而必须读取的块数(通常为2-4),然后迭代通过for循环读取文件(忽略“ +17+filenamesize ”的东西,这就是全部在该计划的后期需要。 但是,仅在第一次,当j=1 ,它是否实际将数据放入buf数组中。 在其他情况下,当j != 1 , strlen(buf)返回0 。 我认为问题是使用fseek()在读取文件之前寻找文件的第二部分或者是内存分配问题。 任何帮助将被赞赏使它将文件的1000-1999 个字符读入buf数组。 附件是代码的相关部分: unsigned char *buf; source = fopen(localpath,”r”); temp = filesize / BLOCK_SIZE + 1; for (j=1; j <= temp; j++) { if (j == 1) { buf = (unsigned char *) malloc((sizeof(unsigned char)) * (BLOCK_SIZE + […]

在printf(“%d”,5); 是5存储在内存中?

#include char* func (); int main ( ) { char *p; p=func(); printf(“%c”,*p); } char* func() { return “hello”; } 这里,printf打印“h”,这意味着创建了一个指向“hello”的指针,并且字符串“hello”存储在内存中。 同样,在printf(“%d”,5)中,存储在存储器中的是“5”吗?

由于不正确的内存对齐,使用SSE内在函数时出现分段错误

我第一次使用SSE内在函数,即使确保了16byte内存对齐,我也遇到了分段错误。 这篇文章是我之前问题的扩展: 如何分配16byte内存对齐数据 这是我声明我的数组的方式: float *V = (float*) memalign(16,dx*sizeof(float)); 当我尝试这样做时: __m128 v_i = _mm_load_ps(&V[i]); //It works 但是当我这样做时: __m128 u1 = _mm_load_ps(&V[(i-1)]); //There is a segmentation fault 但如果我这样做: __m128 u1 = _mm_loadu_ps(&V[(i-1)]); //It works again 但是我想消除使用_mm_loadu_ps并希望仅使用_mm_load_ps使其工作。 我正在使用Intel icc编译器。 我该如何解决这个问题? 更新: 使用以下代码中的两个操作: void FDTD_base (float *V, float *U, int dx, float c0, float c1, float c2, float […]

地址长度的字符串文字

我看到在使用GCC的Linux系统上,字符串文字的地址似乎比其他变量小得多。 例如,以下代码生成下面显示的o / p。 #include int main() { char *str1 = “Mesg 1”; char *str2 = “Mesg 2”; char str3[] = “Mesg 3”; char str4[] = “Mesg 4”; printf(“str1 = %p\n”, (void *) str1); printf(“str2 = %p\n”, (void *) str2); printf(“&str3 = %p\n”, (void *) str3); printf(“&str4 = %p\n”, (void *) str4); return 0; } […]

const int不占用空间?

在对Anonymous enum用法的 回答中 , Oli Charlesworth指出: const int是不可变的,并且可能不会占用任何空间,具体取决于编译器选择的操作。 如果我声明const int i = 10 ,如果它“可能不占用任何空间”,那么该10如何存储? 假设int是4个字节,我假设保留至少4个字节来存储10作为const int 。

如何正确处理UnsafeMutablePointer

我有点困惑。 什么时候我必须免费拨打电话和/ devalloc? 我正在研究一个学习核心音频的简短代码片段。 我想如果我调用UnsafeMutablePointer.alloc(size)那么我应该调用destroy & dealloc 。 但是如果我使用malloc()或calloc()我应该调用free() 。 在这个来自Learning Core Audio的示例中,以下代码片段让我想知道: var asbds = UnsafeMutablePointer.alloc(Int(infoSize)) audioErr = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat, UInt32(sizeof(fileTypeAndFormat.dynamicType)), &fileTypeAndFormat, &infoSize, asbds) 在这里我使用alloc 。 调用释放内存是free的。 free(asbds) 但为什么不呢 asbds.destroy(Int(infoSize)) asbds.dealloc(Int(infoSize)) 我希望遵循规则。 我会感激任何帮助,因为这让我头晕目眩。 文档说我负责销毁和dealloc,以便部分清晰,但是以哪种方式?

如果bool是int的宏,为什么它的大小不同?

我希望有人可以解释原因 #include printf(“size of bool %d\n”, sizeof(bool)); printf(“size of int %d\n”, sizeof(int)); 输出到 size of bool 1 size of int 4 我看过http://pubs.opengroup.org/onlinepubs/009695399/basedefs/stdbool.h.html这似乎表明bool本质上是_Bool的一个宏,当设置为true或false时,它真的只是一个整数常量的宏。 如果是整数,为什么它的大小不一样? 我问,因为我们花了太长时间来调试我们没有分配足够内存的程序。

在C中取消引用函数指针以访问CODE内存

我们在这里处理C. 我只是有了这个想法,想知道是否有可能访问存储函数的内存点,比如说foo并将函数的内容复制到内存中的另一个点。 具体来说,我试图让以下工作: #include #include #include void foo(){ printf(“Hello World”); } int main(){ void (*bar)(void) = malloc(sizeof foo); memcpy(&bar, &foo, sizeof foo); bar(); return 0; } 但运行它会出现总线错误: Bus error: 10 。 我正在尝试将函数foo的内容复制到内存bar空间,然后执行新创建的functionbar 。 除了查看这样的事情是否可能之外,没有其他原因可以揭示C语言的复杂性。 我没想到这有什么实际用途。 我正在寻找指导让这个工作,或以其他方式被告知,有理由,为什么这不起作用 编辑查看一些答案并了解读取 , 写入和可执行内存,我刚才意识到可以通过写入可执行内存在C中动态创建函数。

当memcpy()比memmove()更快时,真正的重要案例是什么?

memcpy()和memmove()之间的关键区别在于,当源和目标重叠时, memmove()将正常工作。 当缓冲区肯定不重叠时, memcpy()更可取,因为它可能更快。 困扰我的是这个潜在的 。 它是一个微优化还是当memcpy()更快时有真正重要的例子,所以我们真的需要使用memcpy()而不是到处都有memmove() ?