我尝试对齐大小的数组和非对齐大小的数组进行操作,但结果是一个难题,非对齐大小的数组比对齐大小的数组快,这是我的代码:
TimeMeter timeMeter;
const int N = 100000;
_Tp A[64];
_Tp B[65];
int szA = sizeof(A);
int szB = sizeof(B);
// Method 1
timeMeter.start();
for ( int n = 0; n < N; n++ )
{
memset(A, 0, szA);
}
timeMeter.stop();
printf("Method 1 Time usage = %f ms\n", timeMeter.span());
// Method 2
timeMeter.start();
for ( int n = 0; n < N; n++ )
{
memset(B, 0, szB);
}
timeMeter.stop();
printf("Method 2 Time usage = %f ms\n", timeMeter.span());
_Tp
为char
时(8):方法1费用为2.195毫秒,方法2费用为2.175毫秒_Tp
为int
时(32):方法1费用为13.313毫秒,方法2费用为5.987毫秒_Tp
为double
时(64):方法1费用为14.266毫秒,方法2费用为11.304毫秒答案 0 :(得分:2)
您的基准测试无效,原因如下:
答案 1 :(得分:0)
类型只需要在它们自身内对齐,即char
必须在1字节边界上对齐,int
必须在4字节边界上对齐,double
必须在8字节边界上对齐。
要真正测试未对齐的访问,请尝试执行
_Tp* A = (_Tp*)((char*)(new char[num * sizeof(_Tp)]) + 1);
...
delete[] (_Tp*)((char*)A - 1);
此外,memset
将所有内容视为指向一系列char
s的指针,这些指针永远不会对齐,因此无论您使用数组做什么,都无法获得memset
做一个未对齐的写作。