测 试结果表明,改变结构默认的对齐方式对其成员访问效率的影响是蛮大的。另外按CPU宽度来测试似乎与默认对齐方式的结果差不多,看来 #pragma pack(1)还是要慎用!!唉~~ 不过要是在 pack(1) 慎用的情况下,做socket 程序时。。。发送或接收数据的结构可怎么写??用 pack(1) 定义socket的收/发数据结构用起来很方便啊。。可是如果为了效率而舍弃的啊?这些数据该规划用什么方式来访问呢?有 比用 pack(1)来定义结构更方遍,更高效的方法吗?
#pragma pack( 1 )
class Test
{
public:
char a;
int b;
} ;
#pragma pack()
class Test1
{
public :
char a;
int b;
} ;
__declspec(align( 32 )) class S
{
public:
char a;
int b;
} ;
void main()
{
for(int k = 0; k < 20; k++)
{
Test t;
t.a = 0x33;
t.b = 3;
int j = 0;
int g = 0;
DWORD dTick = GetTickCount();
for(int i = 0; i < 100000000; i++)
{
if(t.b == g)
{
j++;
}
t.b = i;
g = j;
}
printf("Test0:%d %d %d ",__alignof(Test),sizeof(Test),GetTickCount() - dTick);
Test1 t1;
t1.a = 0x33;
t1.b = 3;
dTick = GetTickCount();
for(int i = 0; i < 100000000; i++)
{
if(t1.b == g)
{
j++;
}
t1.b = i;
g = j;
}
printf("Test1:%d %d %d ",__alignof(Test1),sizeof(Test1),GetTickCount() - dTick);
S t2;
t2.a = 0x33;
t2.b = 3;
dTick = GetTickCount();
for(int i = 0; i < 100000000; i++)
{
if(t2.b == g)
{
j++;
}
t2.b = i;
g = j;
}
printf("Test2:%d %d %d ",__alignof(S),sizeof(S),GetTickCount() - dTick);
}
}
输出结果:
Test0:1 5 437
Test1:4 8 125
Test2:32 32 125
Test0:1 5 438
Test1:4 8 125
Test2:32 32 125
Test0:1 5 453
Test1:4 8 125
Test2:32 32 125
Test0:1 5 437
Test1:4 8 125
Test2:32 32 125
Test0:1 5 453
Test1:4 8 125
Test2:32 32 125
Test0:1 5 438
Test1:4 8 125
Test2:32 32 125
Test0:1 5 437
Test1:4 8 125
Test2:32 32 125
Test0:1 5 438
Test1:4 8 125
Test2:32 32 125
Test0:1 5 437
Test1:4 8 125
Test2:32 32 125
Test0:1 5 438
Test1:4 8 125
Test2:32 32 125
Test0:1 5 437
Test1:4 8 125
Test2:32 32 125
Test0:1 5 438
Test1:4 8 125
Test2:32 32 125
Test0:1 5 437
Test1:4 8 125
Test2:32 32 141
Test0:1 5 437
Test1:4 8 125
Test2:32 32 125
Test0:1 5 438
Test1:4 8 125
Test2:32 32 125
Test0:1 5 437
Test1:4 8 125
Test2:32 32 125
Test0:1 5 438
Test1:4 8 125
Test2:32 32 125
Test0:1 5 437
Test1:4 8 125
Test2:32 32 125
Test0:1 5 438
Test1:4 8 125
Test2:32 32 140
Test0:1 5 438
Test1:4 8 125
Test2:32 32 125
请按任意键继续. . .