- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
上下文:
char buffer[99]; int* ptr_int=(int*)(buffer+n);
然后我对 *ptr_int 执行一些耗时的操作并使用 windows.h/QueryPerformanceCounter 测量执行时间。
困惑:对于 n 的值:0 到 4,执行时间约为 12 秒对于 n 的值:5、6、7,执行时间约为 20 秒对于 n 的值:32,33,执行时间再次约为 12 秒。
这可能是由于对齐所致,但有人可以解释一下究竟是怎么回事吗?
奔腾双核T2410/winxp/g++3.4.2(mingw-special)
编辑我不是试图通过使用更好的方法来避免对齐问题,而是试图找出为什么我突然遇到 int* ptr_int=(int*)(buffer+5);
没有问题:int* ptr_int=(int*)(buffer+3);
或 int* ptr_int=(int*)(buffer+33);
最佳答案
在现代 CPU 上,数据需要正确对齐,否则就会付出惨重代价。一个 32 位整数需要按 4 个字节对齐,否则 CPU 将在内部需要读取两个整数并四处移动以适应。如果您尝试读取未对齐的整数,某些 CPU 实际上会崩溃。
同样,一个 128 位的 __vector4 需要按 16 个字节等对齐。
顺便说一下,还有其他因素在起作用,比如数据缓存行,所以第一次访问新的缓存行时,会有很大的损失 - 后续读取会快得多。
关于C++ : comparing performance of pointers pointing at different locations in a char array (trying to learn alignment),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4264291/
我是一名优秀的程序员,十分优秀!