社区
C语言
帖子详情
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是不一样的,
能举个例子么
打赏
举报
回复
赞
相关推荐
sizeof
(结构体)的
值
在笔试时,老是看到它定义一个结构体,要你给出这个结构体
sizeof
()的
值
。
结构体(
st
ruct
) 的
sizeof
大小
C语言中,
sizeof
的Semantics(语义)如下:The
sizeof
operator yields the size (in by
te
s) of its operand, which may be an expression or the parenthesizedC语言中,,
sizeof
的Semantics(语义)如下:The ...
sizeof
的详尽计算结构体字节数方法
Sizeof
用法 本文主要包括二个部分,第一部分重点介绍在VC中,怎么样采用
sizeof
来求结构的大小,以及容易出现的问题,并给出解决问题的方法,第二部分总结出VC中
sizeof
的主要用法。 1、
sizeof
应用在结构上的...
sizeof
()计算结构体的大小
简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并
不是
简单的把所有成员大小相加,
而
是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题。 一、没有成员的结构体...
为什么会有内存对齐?
比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的。 为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存...
发帖
C语言
加入
微信扫一扫
点击复制链接
分享社区
下载分享明细
6.6w+
社区成员
24.2w+
社区内容
C语言相关问题讨论
社区管理员
申请成为版主
帖子事件
创建了帖子
2003-11-18 12:20
社区公告
暂无公告