윈도우 11도 32비트는 지원하지 않고 64비트 환경만 지원하더니, 드디어 비주얼 스튜디오도 64비트로 넘어갔다.
16비트에서 32비트로 넘어갈 때도 눈 깜박할 사이에 넘어갔는데 64비트로의 전환 역시 신속하게 진행되고 있다.
이전에 VS2019에서 돌리던 프로젝트들을 하나씩 VS2022로 이관했는데, 이 과정에서 묘한 컴파일 실패가 발생했다.
아래의 코드를 32비트 릴리즈 모드에서 컴파일하면 환경을 어떻게 설정해도 컴파일이 중단된다.
64비트나 디버그 모드에선 이상 없이 잘 되지만, 딱 32비트 릴리즈 모드에서만 컴파일러 자체가 멈춘다.
식을 좀 더 단순하게 써보라는 조언만 남기고 그냥 중단된다.
#pragma loop(hint_parallel(0))
#pragma loop(ivdep)
for (int i = 0; i < nSize; ++i) {
const BYTE *i1 = img + (size_t)i * 3;
size_t offset = ((i % nWidth) * nHeight + nHeight - 1 - (i / nWidth)) * 3;
BYTE *i2 = ret + offset;
*(PWORD)(i2) = *(PWORD)(i1);
i2[2] = i1[2];
}
그런데, 이 코드를 아래와 같이 수정하면 별 일 없이 컴파일된다.
식을 단순화하라는 조언을 충실하게 따랐을 뿐인데, 잘 된다.
#pragma loop(hint_parallel(0))
#pragma loop(ivdep)
for (int i = 0; i < nSize; ++i) {
const BYTE *i1 = img + (size_t)i * 3;
//size_t offset = ((i % nWidth) * nHeight + nHeight - 1 - (size_t)(i / (int)nWidth)) * 3;
const size_t xx = (size_t)i % nWidth;
const size_t yy = (size_t)(i / (int)nWidth);
size_t offset = (xx * nHeight + nHeight - 1 - yy) * 3;
BYTE *i2 = ret + offset;
*(PWORD)(i2) = *(PWORD)(i1);
i2[2] = i1[2];
}
당장은 이걸로 별 문제 없겠지만, 그래도 이건 수정해야 할 오류가 맞으니 MS에 리포트했다.
상황을 몇 번 더 설명하고, 소스 코드 전체를 보내준 결과 동일한 컴파일 실패를 재현했다고 한다.
아직까진 수정된 것 같진 않지만, 조만간 수정되겠지...
덧. 원래는 수정 완료후 포스팅하려고 했는데, 3주 가까이 되도록 수정이 안 되는 거 보니 시간이 많이 걸릴 것 같아 그냥 포스팅함.