返回信息流#include <iostream>
using namespace std;
void main()
{
struct st
{
char a;
short b;
char c;
long d;
}st1;
cout << sizeof(st1);
}
我怎么觉得输出8呢,(win32系统,vc编译器)
这是一条镜像帖。来源:北邮人论坛 / cpp / #29933同步于 2009/10/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
结构体字节大小怎么计算
cranberry
2009/10/14镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
【 在 cranberry 的大作中提到: 】
: #include <iostream>
: using namespace std;
: void main()
: ...................
他们在内存中存储的开始位置分别为 0 2 4 8
应该是后一个与前面的对齐,如果你的第二个char和short换个位置就是8
即 0 1 2 4
不太理解“后一个与前面的对齐”,把long换到最前面,还是8
【 在 ding328 的大作中提到: 】
: 他们在内存中存储的开始位置分别为 0 2 4 8
: 应该是后一个与前面的对齐,如果你的第二个char和short换个位置就是8
: 即 0 1 2 4
又是sizeof的问题!!!
怎么可能是8 呢?!! 明显是 12 嘛!
char a;
short b;
char c;
long d;
我们可以看到同类型的 a, c不是连续分配的! 我们又可以看到 有一个long类型(4个字节,
win32 也就是以4字节--int , 为基准)
那么就以long为基准, 只要满足long的整数倍, 就ok了,
如果不满足就补齐!
那么就是 ( 1 + 1 + 2 ) + (1 + 3) + 4 = 12 // (**)
说明: 其中第一个括号中的 第二个 1是为了保证 char a 补齐
第二个括号中的 3 是 为了满足 char c 补齐
如果我们将char c; 放到 char a;的后面那么, a, c为同类型且连续分配,所以他们内存分配也连续,就是说 char c将取代 (**) 式子中第一个括号中的第二个 1 的位置。
这样就没有 ( 1 + 3) 这个项了。
char a;
char c;
short b;
long d;
所以: 这样求出的 sizeof 就是: ( 1 + 1 + 2 ) + 4 = 8
【 在 cranberry 的大作中提到: 】
#include <iostream>
using namespace std;
void main()
{
struct st
{
char a;
short b;
char c;
long d;
}st1;
cout << sizeof(st1);
}
我怎么觉得输出8呢,(win32系统,vc编译器)
Win32的内存对齐系数是4
结构体安排第一个数据的位置从offset 0开始
a的大小是 1 1<4 所以按照1对齐 offset=0 [0] 0是1的整数倍
b的大小是 2 2<4 所以按照2对齐 offset=2 [2,3] 2是2的整数倍
c的大小是 1 1<4 所以按照1对齐 offset=3 [4] 4是1的整数倍
d的大小是 4 4=4 所以按照4对齐 offset=8 [8,11] 8是4的整数倍
所以总共是12个字节