![](/img/trans.png)
[英]Createfile2, ReadFile, and WriteFile; why isn't ReadFile reading what I've written in WriteFile?
[英]CreateFile2, WriteFile, and ReadFile: how can I enforce 16 byte alignment?
我正在使用CreateFile2和WriteFile创建和写入文件,然后将readfile与一起使用,一次将16个字节读取到__m128i中,然后对其执行simd操作。 在调试模式下工作正常,但在发布模式下抛出拒绝访问(0xc0000005)错误代码。 以我的经验,当我尝试将非16字节对齐的内容推入16字节对齐的内容时,就会发生这种情况。 但是,我不确定缺少16字节对齐的地方首先会抬起头来。
#define simd __m128i
它在CreateFile2()调用中吗?
_CREATEFILE2_EXTENDED_PARAMETERS extend = { 0 };
extend.dwSize = sizeof(CREATEFILE2_EXTENDED_PARAMETERS);
extend.dwFileAttributes = FILE_ATTRIBUTE_NORMAL;
extend.dwFileFlags = /*FILE_FLAG_NO_BUFFERING |*/ FILE_FLAG_OVERLAPPED;
extend.dwSecurityQosFlags = SECURITY_ANONYMOUS;
extend.lpSecurityAttributes = nullptr;
extend.hTemplateFile = nullptr;
hMappedFile = CreateFile2(
testFileName.c_str(),
GENERIC_READ | GENERIC_WRITE,
0,
OPEN_ALWAYS,
&extend);
...在WriteFile()调用中?
_OVERLAPPED positionalData;
positionalData.Offset = 0;
positionalData.OffsetHigh = 0;
positionalData.hEvent = 0;
bool writeCheck = WriteFile(
hMappedFile,
&buffer[0],
vSize,
NULL,
&positionalData);
...在以后的ReadFile()调用中?
const simd* FileNodePointer(
_In_ const uint32_t index) const throw()
{
std::vector<simd> Node(8);
_OVERLAPPED positionalData;
positionalData.Offset = index;
positionalData.OffsetHigh = 0;
positionalData.hEvent = 0;
ReadFile(
hMappedFile,
(LPVOID)&Node[0],
128,
NULL,
&positionalData);
return reinterpret_cast<const simd*>(&Node[0]);
}
如何在此处强制执行16字节对齐?
谢谢!
TL; DR您有一个经典的“免费使用后使用”错误。
这些功能都不要求16字节对齐。 如果启用了缓冲,则它们根本不关心对齐;如果启用了直接I / O,则它们要求的页对齐比16字节要严格得多。
如果您的数据缓冲区未对齐,那是因为您是以这种方式创建的。 文件I / O没有移动内存中的缓冲区。
但是您的访问冲突根本不是由对齐问题引起的,它是您从FileNodePointer
返回的悬空指针:
return reinterpret_cast<const simd*>(&Node[0]);
这是指向具有自动生存期的向量内容的指针,向量析构函数在函数返回过程中运行,并释放包含刚从文件读取的数据的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.