为什么你不能把一个FILETIME结构当成一个__int64?
2006-04-11 20:43
281 查看
FILETIME结构是一个64位值,它分成了两个部分:
你可能会被迷惑,就把整个
为什么我们要说这是一个错误?
忽略了字节对齐问题。
通过分析,这三个FILETIME结构出现在WIN32_FIND_DATA结构开头的第4,12和第20个字节,他们已经被
强制转换FILETIME到
就算你的平台能够自动修正这个对齐问题,你仍然会引起问题。思考:为什么
typedef struct _FILETIME {
DWORD dwLowDateTime;
DWORD dwHighDateTime;
} FILETIME, *PFILETIME;
你可能会被迷惑,就把整个
FILETIME结构作为一个
__int64直接进行存取。事实上,它的内存分布同一个64位整数完成相同。下面是个例子:
pi = (__int64*)&ft; // 错误
(*pi) += (__int64)num*datepart; //错误
为什么我们要说这是一个错误?
忽略了字节对齐问题。
FILETIME是由两个DWORD组成的结构,它只需要4个字节对齐,那么这就足够把每一个DWORD对齐到一个有效的DWORD边界。不需要把第一个DWORD去对齐到8个字节。而且事实上,你可能已经使用了一个结构,而这个结构中却没有如此对齐:WIN32_FIND_DATA结构.
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
TCHAR cFileName[ MAX_PATH ];
TCHAR cAlternateFileName[ 14 ];
} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;
通过分析,这三个FILETIME结构出现在WIN32_FIND_DATA结构开头的第4,12和第20个字节,他们已经被
dwFileAttributes成员失去了8个字节对齐特性。Observe that the three
FILETIMEstructures appear at offsets 4, 12, and 20 from the beginning of the structure. They have been thrown off 8-byte alignment by the
dwFileAttributesmember.
强制转换FILETIME到
__int64会(在WIN32_FIND_DATA中会)得到一个没有字节对齐指针。在需要字节对齐的框架上存取一个没有字节对齐指针会引起一个
STATUS_DATATYPE_MISALIGNMENT异常。
就算你的平台能够自动修正这个对齐问题,你仍然会引起问题。思考:为什么
LARGE_INTEGER和
ULARGE_INTEGER结构没有这个问题?
相关文章推荐
- 为什么你不能把一个FILETIME结构当成一个__int64?
- [AD]为什么结构主机和全局编录服务器不能放在同一个域控制器上?
- 为什么结构主机和全局编录服务器不能放在同一个域控制器上?
- 为什么不能在函数体内部初始化一个由extern关键字标记的变量?
- 为什么C++变量名字和函数名字不能是同一个?
- 为什么不能把委托(delegate)放在一个接口(interface)当中?
- 为什么不能直接在BroadCastReceiver中开一个线程执行耗时任务
- c++设计一个不能被继承的类,为什么必须是虚继承?原因分析
- 返回值为什么不能作为重载的一个条件
- c++设计一个不能被继承的类,为什么必须是虚继承?原因分析
- Spring AOP为什么不能拦截同一个对象内方法的嵌套调用(一)
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 高低压为什么不能共地的一个解释
- 为什么用const说明的常量不能用来定义一个数组的初始大小?
- 一个线性布局中,为什么 android:layout_gravity="right"不能控制按钮在屏幕右侧?
- Expression is not assignable (OC为什么不能直接修改结构体属性)!
- magicajax为什么不能提交? magicajax的一个bug
- 为什么super()和this()调用语句不能同时在一个构造函数中出现的解释
- c# 对 struct为什么不能继承类和结构的思考
- 高低压为什么不能共地的一个解释