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