“缓存不友好的代码”和“缓存友好的”代码有什么区别?
我怎样才能确保我编写缓存友好的代码?
我认为缓存不友好代码的一个有启发意义的典型例子是代码扫描C二维数组(例如位图图像)列而不是行方式的代码。
在一行中相邻的元素在内存中也是相邻的,因此按顺序访问它们意味着以上升的内存顺序访问它们; 这是缓存友好的,因为缓存倾向于预取连续的内存块。
相反,以列方式访问这些元素是缓存不友好的,因为同一列上的元素彼此之间的内存距离较远(特别是它们的距离等于行的大小),所以当你使用这种访问模式时在内存中跳跃,可能会浪费在附近的内存中检索元素缓存的努力。
而所有这一切都是为了毁掉这个表演
// Cache-friendly version - processes pixels which are adjacent in memory
for(unsigned int y=0; y<height; ++y)
{
for(unsigned int x=0; x<width; ++x)
{
... image[y][x] ...
}
}
至
// Cache-unfriendly version - jumps around in memory for no good reason
for(unsigned int x=0; x<width; ++x)
{
for(unsigned int y=0; y<height; ++y)
{
... image[y][x] ...
}
}
在小缓存和/或大阵列(例如当前机器上的10+百万像素24bpp图像)的系统中,这种效果可能相当戏剧化(几个数量级的速度); 因此,如果必须进行多次垂直扫描,通常最好先旋转90度的图像,稍后再执行各种分析,将缓存不友好的代码限制为旋转。
先了解什么是缓冲区溢出 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据覆盖在合法数据上,理想的情况是 程序检查数据...