社区
C++ 语言
帖子详情
sizeof问题
yaozhiyong110
2011-03-25 04:19:18
#pragma pack(8)
struct CIntData
{
short da;
int data;
};
struct CTest
{
char d;
CIntData b;
};
#pragma pack(0)
sizeof(CTest) 为12 sizeof(CIntData) 为8 为什么?
字节排列 d 0 0 0 da 0 0 0 data 0 0 0 为什么????(d 占 4字节 da 占4字节 data占4字节)
...全文
120
15
打赏
收藏
sizeof问题
#pragma pack(8) struct CIntData { short da; int data; }; struct CTest { char d; CIntData b; }; #pragma pack(0) sizeof(CTest) 为12 sizeof(CIntData) 为8 为什么? 字节排列 d 0 0 0 da 0 0 0 data 0 0 0 为什么????(d 占 4字节 da 占4字节 data占4字节)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
passerbythesun
2011-03-25
打赏
举报
回复
哇,我学习了
yaozhiyong110
2011-03-25
打赏
举报
回复
谢谢大家 搞那么久开发 字节对齐还没搞明白呢 惭愧....
zyyeung
2011-03-25
打赏
举报
回复
sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐
pengzhixi
2011-03-25
打赏
举报
回复
额 有几条规则是要注意的。
1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。
2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hairetz/archive/2009/04/16/4084088.aspx
yaozhiyong110
2011-03-25
打赏
举报
回复
[Quote=引用 9 楼 yaozhiyong110 的回复:]
引用 6 楼 pengzhixi 的回复:
引用 2 楼 yaozhiyong110 的回复:
引用 1 楼 pengzhixi 的回复:
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12
#pragma pack(8) 我不是让它8字节对齐了吗?
额,因为你所有的数据成员都没有大小……
[/Quote]
而且目前 只有double是8吧 那就是说 字节对齐不可能超过8喽? 不管你pack多少
最多就是8字节对齐??? 是这样吗
yaozhiyong110
2011-03-25
打赏
举报
回复
[Quote=引用 6 楼 pengzhixi 的回复:]
引用 2 楼 yaozhiyong110 的回复:
引用 1 楼 pengzhixi 的回复:
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12
#pragma pack(8) 我不是让它8字节对齐了吗?
额,因为你所有的数据成员都没有大小为8的,最大的Int是4,所以实际上还是按照4……
[/Quote]
那请教下 #pragma pack 还有什么意义呢? 意思是只准往低了对齐 不准往高对齐?
jackiesen
2011-03-25
打赏
举报
回复
32位机器: 需要补齐四位
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---
charshort---~~~~double--------------------------char~~~~~~~~~~~~
~代表自动补齐的位
char a; 和
short b;
占4个字节
double c;
占8个字节
char d;
占4个字节
4+8+4=16
LZ自己算下!
vcgaoshou
2011-03-25
打赏
举报
回复
字符是4字节对齐的,并非每个字节都用
pengzhixi
2011-03-25
打赏
举报
回复
[Quote=引用 2 楼 yaozhiyong110 的回复:]
引用 1 楼 pengzhixi 的回复:
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12
#pragma pack(8) 我不是让它8字节对齐了吗?
[/Quote]
额,因为你所有的数据成员都没有大小为8的,最大的Int是4,所以实际上还是按照4字节对齐
xgy8705023
2011-03-25
打赏
举报
回复
[Quote=引用 2 楼 yaozhiyong110 的回复:]
引用 1 楼 pengzhixi 的回复:
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12
#pragma pack(8) 我不是让它8字节对齐了吗?
[/Quote]
对齐规则会根据自己与指定的数进行比较,按较小的对齐
lyingbo
2011-03-25
打赏
举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12
[/Quote]
正解
xgy8705023
2011-03-25
打赏
举报
回复
会执行内存对齐
yaozhiyong110
2011-03-25
打赏
举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12
[/Quote]
#pragma pack(8) 我不是让它8字节对齐了吗?
pengzhixi
2011-03-25
打赏
举报
回复
struct CTest
{
char d;
CIntData b;
};
char d后面有3个字节是用来对齐的。所以4+8=12
指针的大小--
sizeof
问题
和
sizeof
使用规则
1、什么是
sizeof
首先看一下
sizeof
在msdn上的定义: The
sizeof
keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns ...
C++面试中常被问的
sizeof
问题
总结
本文参考http://www.cppblog.com/w57w57w57/archive/2011/08/09/152845.html又根据自己常被问及的
问题
和常犯的一些错误对其进行了一些补充。
sizeof
的使用非常简单:求对象或者类型的大小。然后
sizeof
又...
C++ 学习杂谈:
sizeof
和
sizeof
(string)的
问题
最近遇到一个令我困惑的
问题
,就是
sizeof
(string)的值,之前在vs2010上测得是固定28,最近在用CLion,上面测得是4,出现了不一样的结果,我又在vs2013上试了一下,结果又不一样,在vs2013上是32. 查阅了相关资料...
二维数组的各种
sizeof
问题
#include #include #include int main() { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int n=
sizeof
(a[0][0]); printf("a=0x%x,*a=0x%x\n",a,*a); printf("a size=%d,*a siz
sizeof
相关
问题
sizeof
的概念
sizeof
是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。
sizeof
操作符以字节形式给出了其操作数的存储大小。 二. 64位Linux系统中的
sizeof
(指针跟自己的系统有关,32...
C++ 语言
65,210
社区成员
250,518
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章