标题:结构体内嵌联合体的占用内存大小问题?
只看楼主
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
结帖率:89.66%
已结贴  问题点数:20 回复次数:9 
结构体内嵌联合体的占用内存大小问题?
程序代码:
#include<iostream.h>
struct test{
    int a;
    char c;
    float f;
    union uu{
    char s[5];
    int n[2];
    }ua;
}myaa;

int main()
{
    cout<<sizeof(test)<<endl;  
    return 0;

}
这段代码我在我的vc++6.0中的运行结果是20。理论上应该是17的。
我不知道是否是我的编译器有问题,不过似乎不是。
请各位帮忙试试,求证一下。
并对各自的输出结果作出解释。谢谢!
搜索更多相关主题的帖子: 内存 联合体 结构 
2010-06-05 15:44
VersionCore
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-6-4
得分:0 
没人回答吗?我用的2010也是20,不知道为什么,继续关注
2010-06-05 15:55
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
得分:0 
谢谢你的到来。
我也在等待。。。。

南国利剑
2010-06-05 16:06
lscalin
Rank: 6Rank: 6
来 自:周总理故乡
等 级:侠之大者
威 望:1
帖 子:91
专家分:405
注 册:2010-5-10
得分:0 
2008  20

灵感不是曹操,说来就来。
2010-06-05 17:56
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:605
专家分:2489
注 册:2009-4-8
得分:0 
定义一个对象,获取它的地址,然后自己再改变指针的值,观察这些值的内容。(对这个类里的数据成员全部赋值)
struct test{
    int a;//指针首先指向它
    char c;//修改指针的值,使其指向这儿+4
    float f;//+1就这样,逐个验证。
    union uu{
    char s[5];
    int n[2];
    }ua;
};

迭代的是人,递归的是神。
2010-06-05 18:12
迷失的木桶
Rank: 4
等 级:业余侠客
帖 子:52
专家分:230
注 册:2010-5-29
得分:10 
字节对齐问题
参见
http://www.


#pragma pack (1) /*指定按1字节对齐*/
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
2010-06-05 18:15
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
得分:0 
回复 6楼 迷失的木桶
谢谢你。我也是刚了解到答案。
不过你提供的资料,我这就去看看。
再次感谢!

南国利剑
2010-06-05 20:38
最近不在
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:5
帖 子:204
专家分:842
注 册:2010-2-28
得分:10 
由于结构体内的数据成员在内存中是连续。当给char分配一个字节,后面在跟一个int型数据,占4个字节。那么int型 就要寻2个周期。后面继续不完整,这样效率很低下。
因此最好取整。系统默认为4。
程序代码:
// Note:Your choice is C++ IDE
#include <iostream>
using namespace std;
int main()
{
   
    return 0;
}

struct A
{
    char c; 1    4
    int n;  4     4   
    int d;  4     4   
};12

struct A
{
    char c;   1    4
    int n;    4    4    
    double d; 8    8
};16

struct A
{
    char c;        1   4   
    int n;        4    4
    char cc;    1    4
}

#pragma pack (1)
struct A
{
    char c;        1   2   
    int n;        4    4
    char cc;    1    2
}

#pragma pack (8)
struct A
{
    char c;        1   4   
    int n;        4    4
    char cc;    1    4
}

class A
{
    A();
private:
    int m;
};   4

class B
{
   
    char c;           1    4
    int n;          4    4
    double d;         1    8
    static int np; 
};    16  静态存储区
int B::np = 10;
空类空结构体都为一个字节。类与结构体一样,不考虑成员函数
当#pragma pack (1)内参数大于最大类型所占字节数,还是按照最大数据内型来处理。要是小于的话,就按参数来处理。
2010-06-06 00:52
刚开始吧
该用户已被删除
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-06-06 12:30
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
得分:0 
回复 8楼 最近不在
不错,说的好!
就是这样!

南国利剑
2010-06-06 17:10



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-309304-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.063081 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved