3
내 Visual C++ 프로그램에서 사용자 지정 operator new
을 사용하여 malloc()
을 사용하여 메모리를 할당합니다. 내 사용자 정의 operator new
저장하는 여분의 메모리의 처음 4 바이트 데이터 블록의 시작 부분으로 오프셋 포인터를 반환한다 (이 프로그램은 32 비트) :내 Visual C++ 사용자 지정 메모리 할당자가 블록을 제대로 정렬하지 않으면 어떻게됩니까?
void* operator new(size_t size)
{
size += sizeof(int);//assume it doesn't overflow
int* result = static_cast<int*>(malloc(size));
if(result == 0) {
throw std::bad_alloc;
}
*result = ... //write extra data
return result + 1;
}
64 비트 (__int64
또는 double
) 블록이 제대로 정렬되지 않습니다.
32 비트 Windows 프로그램에서 어떤 문제가 발생할 수 있습니까?
AFAIK를 충돌의 원인이됩니다 - 성능 저하가 발생할 수 있습니다. x86은 정렬 오류를 자동으로 수정합니다. – valdo
8 또는 16 바이트 정렬 메모리 주소가 필요한 SIMD 명령어가 사용되는 경우 충돌이 발생할 수 있습니다. 그렇지 않은 경우 성능 저하가 발생합니다. –
클럽에 가입하십시오. 나는 또한 자신의 메모리 할당자를 가지고있다. (주로 메모리 관련 문제의 디버깅, 통계 기록, 누수보고 등을 단순화하기 위해). 필자는 항상 8 바이트의 배수로 채우는 머리글을 사용하며 문제가 없었습니다. 하지만 4 바이트는 모른다. – Patrick