关于结构体内存对齐

never517 2007-11-11 07:18:51
结构体中用到内存对齐问题,DATE的结构不清楚,谁知道告诉我下。
例如: struct A
{
int a;
DATE b;
double c;
} x;
struct B
{
char a;
double c;
int b;
} y;
cout<<x<<endl;
cout<<y<<endl;
得结果:32
24
重点在DATE 的结构上。
最好能把具体结构体贴出来。
...全文
291 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xugang_2001 2007-11-12
  • 打赏
  • 举报
回复
ls的正接 在vc下追踪很简单的
NKLoveRene 2007-11-12
  • 打赏
  • 举报
回复
用vc
右键
go to definition of DATE
然后自己看咯
_石头_ 2007-11-12
  • 打赏
  • 举报
回复
打开头文件看一下不就知道了!
never517 2007-11-12
  • 打赏
  • 举报
回复
我想知道的是DATE 这种日期型数据类型的结构,它是个结构体,可是里面的具体的基本类型我不清楚,也找不到,麻烦帮我解决下,最近做个小项目要用到。
never517 2007-11-12
  • 打赏
  • 举报
回复
恩恩,不好意思写错了,谢谢9楼提醒了。
thecorr 2007-11-12
  • 打赏
  • 举报
回复
cout <<x <<endl;   
cout <<y <<endl; //是不是sizeof(x) sieof(y)
never517 2007-11-12
  • 打赏
  • 举报
回复
别提VC 哦,纯C++ 题,头文件我也不知道在那里哦!!
blldw 2007-11-11
  • 打赏
  • 举报
回复
与系统的内存对齐原则有关系:(1)即除了字节类型的对象(如char)外,必须保证对象在内存中的地址是对象大小(以字节为单位)的偶数倍; (2)对象在内存中占用的字节数为2^n(n = 0, 1, 2, ...)。这样的话,对于结构而言,当一个成员的位置在内存中确定后,下一个紧邻其的成员的地址并不一定就是上一个成员的地址加上该成员的大小,如果不是,则就要填充(padding)以保证内存对齐的原则。
以你的例子而言,
struct A {
int a;
double b;
double c;
};
则 sizeof(A) == 24 为true.因为a的大小为4个字节,而下一个成员的类型double为8个字节,所以b的起始地址在a起始地址后的8个字节,即系统在a的后面填充了4个字节,而后的b和c在内存中的位置都是正确的。
可以使用cstddef中的offset宏来查看结构中成员的偏移地址。

// example
#include <iostream>
#include <cstddef>

using namespace std;

struct A {
int a;
double b;
double c;
};


void main()
{
cout << sizeof(A) << endl;
cout << offsetof(A, a) << endl;
cout << offsetof(A, b) << endl;
cout << offsetof(A, c) << endl;
}
// end of example
ryfdizuo 2007-11-11
  • 打赏
  • 举报
回复
atlcomtime.h里面的是这样定义的
ryfdizuo 2007-11-11
  • 打赏
  • 举报
回复
typedef double DATE;

64,642

社区成员

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

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