结构体的对齐问题

Chivalry 2007-06-24 10:53:31
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不是一种类型
不知道这样理解对不,请教各位,谢谢
...全文
204 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Chivalry 2007-06-27
  • 打赏
  • 举报
回复
看来应该是编译器相关了,我也暂时按照最大的类型是double,long只是修饰符来理解
谢谢各位
散分
tigerweichao 2007-06-24
  • 打赏
  • 举报
回复
这个倒是真的,不同的编译器处理机制不尽相同,最早期的是那种很拙劣的对齐,就是按照最长的存储,发展到现在是一种拼接对其的技术。。。
xlbdan 2007-06-24
  • 打赏
  • 举报
回复
typedef struct {
char c; //1
short s; //4
int i; //4
long l; //4
float f; //4
double d; //8
long double ld; //8
} Primitives;

所以对齐过程为,()内为补齐内存
1+(3)+4+4+4+4+(4)+8+8=40
Chivalry 2007-06-24
  • 打赏
  • 举报
回复
我用的是dev cpp,编译结果是long double 12,整个结构体40
xlbdan 2007-06-24
  • 打赏
  • 举报
回复
long double的大小是8,不是12

你可以在机器上cout<<sizeof(long double)

整个结构体还是按最大字节8的倍数来对齐的
mymtom 2007-06-24
  • 打赏
  • 举报
回复
不同的编译器结果不同?
#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
chenyu2202863 2007-06-24
  • 打赏
  • 举报
回复
sizeof(double)是8
这样就好解释了
chenyu2202863 2007-06-24
  • 打赏
  • 举报
回复
sizeof(long double) 结果是12
cout << sizeof(Primitives) << endl;结果是40
xlbdan 2007-06-24
  • 打赏
  • 举报
回复
哦对,对不起,我弄错了,应该是这样:

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个字节
mymtom 2007-06-24
  • 打赏
  • 举报
回复
short不是2字节么?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧