測 試結果表明,改變結構默認的對齊方式對其成員訪問效率的影響是蠻大的。另外按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
請按任意鍵繼續. . .