您的位置:首页 > 其它

为什么你不能把一个FILETIME结构当成一个__int64?

2006-04-11 20:43 281 查看
FILETIME结构是一个64位值,它分成了两个部分:

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
FILETIME
structures appear at offsets 4, 12, and 20 from the beginning of the structure. They have been thrown off 8-byte alignment by the
dwFileAttributes
member.

强制转换FILETIME到
__int64会(在WIN32_FIND_DATA
中会)得到一个没有字节对齐指针。在需要字节对齐的框架上存取一个没有字节对齐指针会引起一个
STATUS_DATATYPE_MISALIGNMENT
异常。

就算你的平台能够自动修正这个对齐问题,你仍然会引起问题。思考:为什么
LARGE_INTEGER
ULARGE_INTEGER结构没有这个问题?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐