现在的位置: 首页 > 综合 > 正文

C++类的内存对齐

2013年09月01日 ⁄ 综合 ⁄ 共 979字 ⁄ 字号 评论关闭

内存对齐。对下面的类:

       class       B{

              public:

int m_a;

                     short int m_b;

                     double m_c

        private:

                     int m_d;

              public:

                     int GetValue(){ return m_c; }

       };

      大家可以猜一下类B对象的大小。如果你猜是184+2+8+4),也不能说你错。但是你用sizeof(B)一看,结果竟然是24!多出来的6个字节是怎么回事呢?其实是内存对齐搞的鬼。在编译器的结构成员对齐设置为默认的情况下,分配给各个成员变量的内存大小似乎是向占最大空间的成员变量对齐的(这里我不敢肯定,还没看到权威的说法)。在B类中,首先为m_a分配空间,编译器一次为m_a分配8个字节(与最大成员m_c对齐),实际上m_a只占4个字节,还有4个字节多。接着编译器为m_b分配空间,经检查,m_b只占2字节,刚好前面还有4个字节多,所以m_b就放在前面多出的那4个字节空间中,现在已经为m_am_b分配了空间,但是m_a加上m_b也就只有6字节,还有2个字节多。如果下面分配的变量刚好是2字节的话,那就刚刚好装满8个字节,没有浪费空间,可是下面是要为double类型的变量分配空间,m_c占了8个字节,显然2个字节是装不下的,因此编译器再为m_c分配了8个字节的空间,刚装满。接下来又为m_d分配空间,根据之前的规则,编译器分配给m_d的空间也是8字节。这样看来,编译器总共为B的对象分配了8+8+8=24字节的空间。

分配时,以最长字节(double m_c8字节)为最小分配单元。Sizeof(B)8字节的整数倍。

 

 

可能你觉得编译器这样做是浪费内存空间,但实际上这样做是很适合CPU做一些指令操作的,具体是怎样我不知道,一句话:用空间效率来换时间效率。如果你还是觉得空间比较重要,那么你可以通过设置编译属性或使用编译器指令#pragma来指定编译器所做的对齐方式,例如语句:#pragma
pack(1)
就是设置向1字节对齐。这时使用sizeof(B)得出的结果就是18了。

 

抱歉!评论已关闭.