字节对齐并等于缓存行大小
可能重复:
C ++的新操作对地址返回是否有任何保证?
在这个程序中,我打印每个由无符号字符组成的新地址。 然后最后将它们向后删除。
#include "stdafx.h"
#include<stdlib.h>
void func();
int main()
{
int i=10;
while(i-->0)printf("loaded %i n", (new unsigned char));
getchar();
unsigned char *p=new unsigned char;printf("last pointer loaded %i n", p);
i=10;
while(i-->0)delete (p-=64);
getchar();
p+=640;
delete p;//nearly forgot to delete this ^^
return 0;
}
输出:
正如你所看到的,每个新的返回64字节对齐的数据。
问题:这是64字节等于缓存行大小还是只是一个编译器的东西?
问题:我应该使我的结构大部分是64字节长吗?
问题:当我更改我的cpu,ram,OS或编译器时,这会不同吗?
Pentium-m,VC ++ 2010 express,windows-xp
谢谢。
当您考虑大量分配和释放后发生的情况时,堆管理器的实现选择会更有意义。
对malloc()
调用需要找到一块没有使用的足够大小的块来分配。 它可能更大(在这种情况下,它可以创建一个有区别的免费块 - 或者浪费它)。 寻找块的最接近尺寸的天真策略被称为最适合。 如果它开始创建新的空闲块,你可以称之为最糟糕的休假。
使用后,最适合的方法会导致大量的碎片,这是由不可能再次分配的小块引起的,并且搜索空闲块的成本变高。
因此,高性能堆管理员不能像这样工作。 相反,它们作为各种固定块大小的池分配器工作。 其中块是2的权力(例如64,128,256,512...
)规范的方案,尽管投入一些中间值也可能是值得的(例如48,96,192...)
。 在这个方案中, malloc()
和free()
都是O(1)
操作,并且分配的关键部分是最小的 - 可能是每个池 - 这在多线程环境中变得重要。
小分配中的内存浪费远比碎片化, O(n)
alloc dealloc复杂性和MT性能差。
与高速缓存行大小相比,最小块大小是这些经典的工程设计权衡之一,并且可以肯定的是,微软做了相当多的实验以达到64
的最低限度。 FWIW,我敢肯定你会发现现代CPU的高速缓存线大小比这个大。
上一篇: byte aligned and equal to cache line size
下一篇: What's the difference between commit() and apply() in Shared Preference