首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

结构体的对齐有关问题

2012-03-11 
结构体的对齐问题typedefstruct{charcshortsintilonglfloatfdoubledlongdoubleld}Primitivescout

结构体的对齐问题
typedef   struct   {
            char   c;
            short   s;
            int   i;
            long   l;
            float   f;
            double   d;
            long   double   ld;
        }   Primitives;
         
        cout   < <   sizeof(Primitives)   < <   endl;

这个输出的大小是40
可是long   double的大小是12
按照对齐的规则,结构体总大小应该是其中占用字节数最大的类型的整数倍
因此把long   double当成是一个类型是解释不通的
我的理解是在这个结构体中占用字节数最大的就是double
long只是一个修饰符,long   double不是一种类型
不知道这样理解对不,请教各位,谢谢

[解决办法]
short不是2字节么?
[解决办法]
哦对,对不起,我弄错了,应该是这样:

typedef struct {
char c; //1
short s; //2
int i; //4
long l; //4
float f; //4
double d; //8
long double ld; //8
} Primitives;

所以对齐过程为,()内为补齐内存
1+(1)+2+4+4+4+8+8=32

所以这个结构体对象的大小是32个字节
[解决办法]
sizeof(long double) 结果是12
cout < < sizeof(Primitives) < < endl;结果是40

[解决办法]
不同的编译器结果不同?
#include <stdio.h>

typedef struct {
char c;
short s;
int i;
long l;
float f;
double d;
long double ld;
} Primitives;

int main(void)
{
Primitives p;

(void) printf( "sizeof(p.c) = %d\n ", sizeof(p.c));
(void) printf( "sizeof(p.s) = %d\n ", sizeof(p.s));
(void) printf( "sizeof(p.i) = %d\n ", sizeof(p.i));
(void) printf( "sizeof(p.l) = %d\n ", sizeof(p.l));
(void) printf( "sizeof(p.f) = %d\n ", sizeof(p.f));
(void) printf( "sizeof(p.d) = %d\n ", sizeof(p.d));
(void) printf( "sizeof(p.ld) = %d\n ", sizeof(p.ld));

(void) printf( "sizeof(p) = %d\n ", sizeof(p));

(void) printf( "address(p.c) = %08x\n ", &(p.c));
(void) printf( "address(p.s) = %08x\n ", &(p.s));
(void) printf( "address(p.i) = %08x\n ", &(p.i));
(void) printf( "address(p.l) = %08x\n ", &(p.l));
(void) printf( "address(p.f) = %08x\n ", &(p.f));
(void) printf( "address(p.d) = %08x\n ", &(p.d));
(void) printf( "address(p.ld) = %08x\n ", &(p.ld));

return 0;
}

XP+VC6下输出:
sizeof(p.c) = 1
sizeof(p.s) = 2
sizeof(p.i) = 4
sizeof(p.l) = 4
sizeof(p.f) = 4
sizeof(p.d) = 8
sizeof(p.ld) = 8
sizeof(p) = 32
address(p.c) = 0012ff60
address(p.s) = 0012ff62
address(p.i) = 0012ff64
address(p.l) = 0012ff68
address(p.f) = 0012ff6c
address(p.d) = 0012ff70
address(p.ld) = 0012ff78

FreeBSD5.4+gcc3.4.2
输出:
sizeof(p.c) = 1


sizeof(p.s) = 2
sizeof(p.i) = 4
sizeof(p.l) = 4
sizeof(p.f) = 4
sizeof(p.d) = 8
sizeof(p.ld) = 12
sizeof(p) = 36
address(p.c) = bfbfec64
address(p.s) = bfbfec66
address(p.i) = bfbfec68
address(p.l) = bfbfec6c
address(p.f) = bfbfec70
address(p.d) = bfbfec74
address(p.ld) = bfbfec7c

[解决办法]
这个倒是真的,不同的编译器处理机制不尽相同,最早期的是那种很拙劣的对齐,就是按照最长的存储,发展到现在是一种拼接对其的技术。。。

热点排行