Tag: 内存

L1内存带宽:使用相差4096 + 64字节的地址,效率下降50%

我想用英特尔处理器实现以下操作的最大带宽。 for(int i=0; i<n; i++) z[i] = x[i] + y[i]; //n=2048 其中x,y和z是浮点数组。 我在Haswell,Ivy Bridge和Westmere系统上这样做。 我最初分配了这样的内存 char *a = (char*)_mm_malloc(sizeof(float)*n, 64); char *b = (char*)_mm_malloc(sizeof(float)*n, 64); char *c = (char*)_mm_malloc(sizeof(float)*n, 64); float *x = (float*)a; float *y = (float*)b; float *z = (float*)c; 当我这样做时,我获得了每个系统预期的峰值带宽的大约50%。 峰值计算为frequency * average bytes/clock_cycle 。 每个系统的平均字节/时钟周期为: Core2: two 16 byte reads one […]

将void指针转换为整数数组

我有一个问题,我有一个指向内存区域的指针。 我想用这个指针来创建一个整数数组。 基本上这就是我所拥有的,指向大小为100 * 300 * 2 = 60000字节的内存地址的指针 unsigned char *ptr = 0x00000000; // fictional point in memory goes up to 0x0000EA60 我想要实现的是将此内存检查为大小为100 * 150 = 15000 ints = 60000字节的整数数组,如下所示: unsigned int array[ 100 ][ 150 ]; 我假设它涉及一些铸造虽然我不确定如何制定它。 任何帮助,将不胜感激。

为什么我不应该对未由malloc()分配的变量调用free()?

我在某处读到使用free来摆脱一个不是通过调用malloc创建的对象是灾难性的,这是真的吗? 为什么?

如何在C中打印出变量的内存内容?

假设我做了 double d = 234.5; 我想看看d [整个8字节]的内存内容 我怎么做?

在C中使用Realloc

就realloc的使用而言,它确实是一个建议,更具体地说,如果我可以利用它来简化我现有的代码。 基本上,下面的内容,它动态分配一些内存,如果我超过256,那么数组需要增加大小,所以我malloc一个临时数组,大小2倍,memcpy等(见下文)。 我只是想知道是否可以在下面的代码中使用realloc,简化它,任何建议,示例代码,甚至是如何实现它的提示非常感谢! 干杯。 void reverse(char *s) { char p; switch(toupper(s[0])) { case ‘A’: case ‘E’: case ‘I’: case ‘O’: case ‘U’: p = s[strlen(s)-1]; while( p >= s ) putchar( p– ); putchar( ‘\n’ ); break; default: printf(“%s”, s); break; } printf(“\n”); } int main(void) { char c; int buffer_size = 256; char *buffer, […]

如何在不触摸缓存的情况下写入或读取内存

有没有办法在不触及x86 CPU下的L1 / L2 / L3缓存的情况下写入/读取内存? 是否完全由硬件管理的x86 CPU缓存? 编辑:我想这样做,因为我想采样内存的速度,看看内存的任何部分性能是否下降。

当你尝试释放()已经释放c中的内存时会发生什么?

例如: char * myString = malloc(sizeof(char)*STRING_BUFFER_SIZE); free(myString); free(myString); 这样做会有不良副作用吗?

释放已分配的内存:realloc()与free()

所以我有一块内存分配了malloc() ,稍后用realloc()更改。 在我的代码中的某些时候我想要清空它,我的意思是基本上给它0的内存。用realloc(pointer,0)直观地做一些事情。 我在这里读到这是实现定义的,不应该使用。 我应该使用free() ,然后再做另一个malloc()吗?

当realloc移动内存块时如何更新其他指针?

realloc引用说: 该function可以将存储块移动到新位置,在这种情况下返回新位置。 这是否意味着如果我这样做: void foo() { void* ptr = malloc( 1024 ); unsigned char* cptr = ( unsigned char* )ptr+256; ptr = realloc( ptr, 4096 ); } 如果realloc移动块,cptr可能会变为无效? 如果是,那么以任何方式重新分配信号,它将移动块,以便我可以做一些事情来防止cptr变得无效?

malloc(0)实际上有效吗?

可能重复: malloc(0)有什么意义? 为什么malloc(0)实际上返回一个有效的写指针? char *str = NULL; str = (char*)malloc(0); // allocate 0 bytes ? printf(“Pointer of str: %p\n”, str); strcpy(str, “A very long string ……………….”); printf(“Value of str: %s”, str); free(str); // Causes crash if str is too long 输出: Pointer of str: 0xa9d010 Aborted Value of str: A very long string ………………. 当str更短时,它就可以正常工作。 […]