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

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

sizeof(testStruct)的值为什么是:16,而不是12 ???
vc60+win2000pro
...全文
142 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
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是不一样的,

能举个例子么

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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