内存对齐:结构中的结构联合偏移量怎么算

hhddzz 2011-04-13 12:41:54
假定long为8字节,int占4字节,short占3字节
那么,MyStructure中t1和t2的偏移量是多少,3、8还是24?

因为我用.NET的平台调用时遇到类似的结构定义
但.NET里没有联合,必须手动用<Offset>指定相同的偏移量来实现
struct TEST1
{
long iType;
long iLength;
};

struct TEST2
{
short iType;
int iLength;
};

struct MyStructure
{
unsigned char dataType;
union{
TEST1 t1;
TEST2 t2;
};
};
...全文
170 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dos5gw 2011-04-14
  • 打赏
  • 举报
回复
不同编译器下的偏移量不一样的,比如gcc和VC的cl所得到的结果是不一样的,所以,自己实验为准
preciousboy 2011-04-13
  • 打赏
  • 举报
回复
你单步一下,在工作空间看看他们的地址,就可以判断他的具体偏移情况啦
hhddzz 2011-04-13
  • 打赏
  • 举报
回复
对了,还有一个问题,就是union后面的成员的偏移量又怎么算
比如MyStructure在联合后面还有成员
struct MyStructure
{
unsigned char dataType;
union{
TEST1 t1;
TEST2 t2;
};
int time;
};
xmu_才盛 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luciferisnotsatan 的回复:]
union按最大的算,所以是TEST1的16字节。
具体定义要看编译器。
[/Quote]

++
简介 易懂, union 是对齐的。。
hhddzz 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luciferisnotsatan 的回复:]
union按最大的算,所以是TEST1的16字节。
具体定义要看编译器。
[/Quote]
额,对齐t1的时候是按TEST1的整体大小来算吗
我还以为是按TEST1的第一个成员来对齐
赵4老师 2011-04-13
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
赵4老师 2011-04-13
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
luciferisnotsatan 2011-04-13
  • 打赏
  • 举报
回复
union按最大的算,所以是TEST1的16字节。
具体定义要看编译器。
CppCoder 2011-04-13
  • 打赏
  • 举报
回复
这个size的值 觉得和开发环境有关
还是在运行时确定的好,要不就设置为1字节对齐,
一般是 占内存最大的 那个成员的大小 的整数倍,不够编译器会留空
qq120848369 2011-04-13
  • 打赏
  • 举报
回复
TEST1:16
TEST2:8

8字节对齐的前提下。

union对struct没影响,TEST1,TEST2 会占用一步分共同的内存。

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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