字节对齐并等于缓存行大小

可能重复:
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的高速缓存线大小比这个大。

链接地址: http://www.djcxy.com/p/54079.html

上一篇: byte aligned and equal to cache line size

下一篇: What's the difference between commit() and apply() in Shared Preference