字节对齐

原文: http://www.cnblogs.com/henryzc/articles/369502.html
sizeof()是操作符,不是函数。

http://blog.csdn.net/wild_fox86116/archive/2007/10/28/1851111.aspx


和网络传输也有联系

1、什么是字节对齐以及为什么要字节对齐。所谓字节对齐就是C/C++编译器为了加速CPU寻址速度而采用的一种策略,通常的表现是将结构中某些不足CPU字长的成员填入若干字节的垃圾值使整个结构的大小成为CPU字长的整数倍。(所谓CPU的字长,可以简单地理解为一个sizeof(int)的大小。)
2、字节对齐的例子。在此列出一段代码,附有相关注释,不多解释。

struct A // size: sizeof( int ) * 2
{
    char c;
    int  n;
};

struct B // size: sizeof( int ) * 3
{
    char c1;
    int  n;
    char c2;
};

struct C // size: sizeof( double ) * 2
{
    int    n;
    double lf;
};


3、可以说字节对齐是一种以空间换时间的做法。但如果某种情况下,程序员需要将struct A的10000个成员写入文件,那么在32位系统中,这个文件就会浪费30000个字节的空间,浪费率达到了37.5%。这时候的解决方式是改变默认的字节对齐方式,具体实现是利用了#pragma链接器指令。下面的例子使用了1字节的对齐,也就是不对齐。
#pragma pack( push, 1 )
struct D // size: 1 + sizeof( int )
{
    char c;
    int  n;
};
#pragma pack( pop )

该指令的使用方法不止此一种,更多信息请参考MSDN。
4、1字节的对齐还有其它一些魔术般的作用,譬如可将指令的机器码写入某种结构,然后使之执行。ATL的CWndProcThunk就采用了这种手段,参见atlwin.h。

你可能感兴趣的:(C++,c,.net,Blog,C#)