CreateFile2 및 WriteFile을 사용하여 파일을 만들고 쓰고 나중에 16 바이트를 __m128i로 한 번에 읽은 다음에 simd 작업을 수행하는 readfile을 사용합니다. 디버그 모드에서 제대로 작동하지만 릴리스 모드에서 액세스 거부 (0xc0000005) 오류 코드가 발생합니다. 내 경험에 의하면, 16 바이트가 아닌 16 바이트짜리 물건을 16 바이트 정렬 된 물건으로 밀어 넣으려고 할 때 그런 일이 발생합니다. 그러나 16 바이트 정렬 부족으로 인해 처음에는 못생긴 머리를 낳고 있습니다.CreateFile2, WriteFile 및 ReadFile : 어떻게 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 바이트 맞춤을 적용하려면 어떻게해야합니까?
감사합니다.
디버거에서 알려주는 것은 무엇입니까? 사고 현장에서 거꾸로 작업하여 문제가 발생한 지점을 찾아냅니다. – 1201ProgramAlarm
캐스트를 제거하면 암시 적 변환으로 충분하고 reinterpret_cast는 위험하며 컴파일러는 코드가 단순화 될 때 평생 오류를 발견 할 가능성이 높습니다. –