社区
C++ 语言
帖子详情
又一个sizeof的问题
yuziyu
2007-03-16 08:11:16
union u{
int a[4];
char b;
double c;
};
struct s{
int a;
u b;
};
int main(int argc,char * argv[])
{
printf("%d",sizeof(s));
}
为什么是24.
...全文
340
5
打赏
收藏
又一个sizeof的问题
union u{ int a[4]; char b; double c; }; struct s{ int a; u b; }; intmain(int argc,char * argv[]) { printf("%d",sizeof(s)); } 为什么是24.
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
wanglukai
2007-03-23
打赏
举报
回复
和编译器有关
pass86
2007-03-17
打赏
举报
回复
字节对齐是个经典的话题。楼上的解释得很到位啊。
h9999h
2007-03-16
打赏
举报
回复
再贴一下吧
结构内部数据对齐规则总结
有关的要点
1 对齐与编译时选择对齐方式有关系
2 与结构内数据的类型有关系
具体规则.
第一个结构成员后的每个结构成员将存储在成员中类型大小最大的类型的大小或 n 字节边界(其中 n 为 1、2、4、8 或 16)两者中较小的一个边界上。n字节边界是由/Zp[n]设置的。边界内不能容纳下一个数据,则补位,重起一个边界分配下一个数据。
举个例子
编译选项 /Zp1
表示使用1个字节进行对齐
struct{
short a1; // short 2个字节
short a2; //
int a3; // int 4个字节
char a4; // char 1个字节
short a5; //short 2个字节
long a6;// long 4个字节
char a7; // char 1个字节
__int64 a8; // unsigned 4个字节
}h;
编译选项 /Zp1
表示使用1个字节进行对齐
1个字节小于全部成员中类型最大的类型的大小,所以对齐以1个字节为基准
所以实际每个数据分配内存后,下一个数据会紧接着分配,不会有空位来补充。所以最后的输出是24个字节。
编译选项 /Zp2
表示使用2个字节进行对齐
2个字节小于全部成员中类型最大的类型的大小,所以对齐以2个字节为基准
我们看一下,
a1为2个字节,分配2个字节
a2为2个字节,紧跟a1分配2个字节
a3为4个字节,紧跟a2分配4个字节
a4为1个字节,紧跟a3分配1个字节
a5为2个字节,a4后面现在是单数位置,补1个字节才是2个字节的边界,a4后面补1个字节的空位,a5然后分配2个字节
a6为4个字节,紧跟a5分配4个字节
a7为1个字节,紧跟a6分配1个字节
a8为8个字节,a7后面现在是单数位置,补1个字节才是2个字节的边界,a7后面补1个字节的空位,a8然后分配8个字节
所以总共是26个字节
编译选项 /Zp4
表示使用4个字节进行对齐
4个字节小于全部成员中类型最大的类型的大小,所以对齐以4个字节为基准
a1为2个字节,分配2个字节
a2为2个字节,紧跟a1分配2个字节
a3为4个字节,紧跟a2分配4个字节
a4为1个字节,紧跟a3分配1个字节
a5为2个字节,a4后面现在是单数位置,补1个字节才是2个字节的边界,a4后面补1个字节的空位,a5然后分配2个字节
a6为4个字节,紧跟a5分配4个字节
a7为1个字节,紧跟a6分配1个字节
a8为8个字节,a7后面现在是单数位置,补3个字节才是新的4个字节的边界,a7后面补3个字节的空位,a8然后分配8个字节
所以总共是28个字节
编译选项 /Zp8
表示使用8个字节进行对齐
8个字节等于全部成员中类型最大的类型的大小,所以对齐以8个字节为基准
a1为2个字节,分配2个字节
a2为2个字节,紧跟a1分配2个字节
a3为4个字节,紧跟a2分配4个字节
a4为1个字节,紧跟a3分配1个字节
a5为2个字节,a4后面现在是单数位置,补1个字节才是2个字节的边界,a4后面补1个字节的空位,a5然后分配2个字节
a6为4个字节,紧跟a5分配4个字节
a7为1个字节,紧跟a6分配1个字节
a8为8个字节,a7后面现在是单数位置,补7个字节才是新的8个字节的边界,a7后面补7个字节的空位,a8然后分配8个字节
所以总共是32个字节
编译选项 /Zp16
表示使用16个字节进行对齐
16个字节大于全部成员中类型最大的类型的大小,所以对齐以成员中类型最大的类型的大小8个字节为基准
等同于/Zp8
在VC++.net 2005下,缺省是8字节边界对齐
结构的位域于此类似。
需要注意的是,连续的同类型只要大小总和在该类型范围内可以看作是一个类型进行分配。(这里win32下,int和long可以看作同类型,字节数相同)
例如:
struct {
char a1;
int a2;
int a3:1;
int a4: 5;
char a5: 3;
int a6:1;
short a7:1;
__int64 a9;
}tt;
相当于结构中有如下数据类型 char int int char int short __int64 数据进行分配
编译选项 /Zp1
表示使用1个字节进行对齐
1个字节小于全部成员中类型最大的类型的大小,所以对齐以1个字节为基准
所以总共是24个字节
编译选项 /Zp2
所以总共是26个字节
等等
现在总结是这样的,大家看看还有什么补充和不足的地方。
believefym
2007-03-16
打赏
举报
回复
那个union反正sizeof是16,因为取最大长度是int[4] = 16
sizeof(s)=24,不会是因为字节对齐取最大的单位double 8吧?
mochen5460
2007-03-16
打赏
举报
回复
字节对齐
C语言每日一练(4)
sizeof
使用常见的两个
问题
(
sizeof
(结构体)以及数组传参之后
sizeof
的
问题
)
*
sizeof
使用过程中的两个重要点: *1、
sizeof
(structs) *要点是对齐的
问题
,以及要深入理解#pragmapack(n); *默认的#pragmapack(n),n=8; *当结构体的成员变量的长度>n时,使用n进行字节对齐 *当结构的成员变量的长度<n时,使用自身默认的字节对齐 * 结构体的总长度应该为n的整数倍,如果不是,要进行补齐操作 *例如: *...
sizeof
(空类)
问题
总结
警钟长鸣在秋招时参加并通过了科大讯飞的笔试,一面就是技术面,被问到 C++中
sizeof
(空类)这种
问题
,等回到宿舍,我才发现,这是剑指offer上的
一个
题。从此恶补剑指offer。最终估计是薪资说14K,要的太高了,完全不了解合肥的消费水平,都是教训啊。。。
问题
描述: 定义
一个
空的类型,里面没有任何成员变量和成员函数。对该类型求
sizeof
,得到的结果时多少? 在该类中添加构造函数和
sizeof
一、
sizeof
用来计算
一个
变量,或者数据类型的长度,以字节为单位。 它是
一个
操作符,如同++,--一样,单操作数。 比如在我的电脑上,
sizeof
(int)=4,
sizeof
(long)=4。还有一般要求的
sizeof
(char)=1。 类:非static数据成员变量+虚函数指针+对齐;无论多少个虚函数,都只有
一个
指向虚函数表的指针(4字节) 联合体:最长成员的大小对齐 带位域:相邻位...
虚函数的
sizeof
问题
根据虚函数的工作机制,通常编译器处理虚函数时会给对象添加
一个
隐藏成员,隐藏成员中保存了
一个
指向函数地址数组的指针,因此类中添加虚函数后,
sizeof
(类名)应为该指针的大小。 测试代码如下: #include&lt;iostream&gt; #include&lt;complex&gt; using namespace std; class A{ public: A(){ cout &lt;...
sizeof
在C语言的作用,C语言中的
sizeof
的用法详解
C语言中的
sizeof
的用法详解一、
sizeof
的概念
sizeof
是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。
sizeof
操作符以字节形式给出了其操作数的存储大小。操作数可以是
一个
表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。二、
sizeof
的使用方法1、用于数据类型
sizeof
使用形式:
sizeof
(type)数据类型必须用括号括住。如
sizeof
...
C++ 语言
65,198
社区成员
250,522
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章