sizeof(testStruct)的值为什么是:16,而不是12 ???

freespider 2003-11-18 12:20:32
struct testStruct
{
int nNum;
double dValue;
};

sizeof(testStruct)的值为什么是:16,而不是12 ???
vc60+win2000pro
...全文
59 18 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
freespider 2003-11-19
根据ajsword()说的 ,试了一下,加上
#pragma pack(1)
后,结果都是22了。

__declspec(align(32)) 没看懂意思。

觉得zhouqingyuan(浪帆) 说得有道理,

其实类似的问题不要深究太多,不同的编译器处理方法是不同的。只要知道要进行填充就可以了,
实际用的时候,试验一下就可以了。
  • 打赏
  • 举报
回复
vmape 2003-11-18
同意楼上的说法,即便你用的不是int nNUM,而是用的char str之类更小的类型,得到的也是16

朋友真是细心啊 ^_^
  • 打赏
  • 举报
回复
zhouqingyuan 2003-11-18
因为在VC这个编译器是这样处理的,将所站用空间填充为内部数据最大站用内存整数倍,
这句话说的不是很对,应该是每一段内存占用空间都为那个最大的,不够就填充。
所以声明变量顺序不同,sizeof是不一样的。
  • 打赏
  • 举报
回复
zhouqingyuan 2003-11-18
因为在VC这个编译器是这样处理的,将所站用空间填充为内部数据最大站用内存整数倍,因为sizeof(double)=8;
所以整个的就为8的整数倍。故为16。

其实类似的问题不要深究太多,不同的编译器处理方法是不同的。只要知道要进行填充就可以了,
实际用的时候,试验一下就可以了。
  • 打赏
  • 举报
回复
5852 2003-11-18
mark 我也不是很明白
  • 打赏
  • 举报
回复
suisuibianbian 2003-11-18
Windows确实是这样做的。在为变量/对象分配内存的时候,总是以4字节对齐,
无论你的变量类型是什么。
也就是说,任何一个变量/对象的存储空间都是以4的整数倍的地址开始的。
首先看一段例子:
……
int i1;
char c1;
char c2;
int i2;

cout << "i1:" <<&i1 << "\n";
cout << "c1:" <<(void *)&c1 << "\n";
cout << "c2:" <<(void *)&c2 << "\n";
cout << "i2:" <<&i2 << "\n";
……
输出结果如下:
i1:0012FF4C
c1:0012FF48
c2:0012FF44
i2:0012FF40
char类型的变量是只占用一个字节的,用sizeof(char)得到的结果也会是1。
但在这里我们看到,c1和c2都被分配了4个字节的存储空间.
下面我们稍微做一下改动,将四个变量声明到一个结构中:
struct test
{
int i1;
char c1;
char c2;
int i2;
};
然后在main()中执行以下语句:

test s;
cout << "s.i1:" <<&s.i1 << "\n";
cout << "s.c1:" <<(void *)&s.c1 << "\n";
cout << "s.c2:" <<(void *)&s.c2 << "\n";
cout << "s.i2:" <<&s.i2 << "\n";
结果如下:
s.i1:0012FF50
s.c1:0012FF54
s.c2:0012FF55
s.i2:0012FF58
晕了~~~~~~~~~~~~~~~~这里的c1怎么就给分配了一个字节的空间?
再看c2,更晕了!@#$%^&*怎么给它老人家三个字节空间?
看来在结构中,结构成员的内存分配不总是4字节对齐的了,而是跟变量本身的大小有关了。
  • 打赏
  • 举报
回复
fbsd 2003-11-18
字节对齐方式和是否压缩(pack),在网络通信和电信程序中,需要特别注意,这是这2类行业初入门常犯的错误。
  • 打赏
  • 举报
回复
yizhili 2003-11-18
mark
  • 打赏
  • 举报
回复
bluedodo 2003-11-18
  • 打赏
  • 举报
回复
vmape 2003-11-18
越来越深奥了,关注,帮你们顶
  • 打赏
  • 举报
回复
jialiang123 2003-11-18
to :freespider()    不懂不懂  为什么不一样呢?
  • 打赏
  • 举报
回复
winco 2003-11-18
内存对齐方式不一样而已
  • 打赏
  • 举报
回复
hwndhwnd 2003-11-18
还可以加上__declspec(align(32))
  • 打赏
  • 举报
回复
ajsword 2003-11-18
试试在你的结构体定义前加上:
#pragma pack(1)
  • 打赏
  • 举报
回复
rerli 2003-11-18
又长见识了:)
  • 打赏
  • 举报
回复
zhoufanking 2003-11-18
又长见识了:)
  • 打赏
  • 举报
回复
freespider 2003-11-18
struct testStruct
{
int nNum;
double nValue;

char ch[10];
}
32

struct testStruct
{
double nValue;
int nNum;

char ch[10];
}
24
  • 打赏
  • 举报
回复
Jack3 2003-11-18
to zhouqingyuan(浪帆)

变量申明顺序不同,sizeof是不一样的,

能举个例子么
  • 打赏
  • 举报
回复
发帖
C语言
加入

6.6w+

社区成员

C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
申请成为版主
帖子事件
创建了帖子
2003-11-18 12:20
社区公告
暂无公告