2010-12-09 2 views
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 프로그램에서 어떤 문제가 발생할 수 있습니까?

+0

AFAIK를 충돌의 원인이됩니다 - 성능 저하가 발생할 수 있습니다. x86은 정렬 오류를 자동으로 수정합니다. – valdo

+2

8 또는 16 바이트 정렬 메모리 주소가 필요한 SIMD 명령어가 사용되는 경우 충돌이 발생할 수 있습니다. 그렇지 않은 경우 성능 저하가 발생합니다. –

+0

클럽에 가입하십시오. 나는 또한 자신의 메모리 할당자를 가지고있다. (주로 메모리 관련 문제의 디버깅, 통계 기록, 누수보고 등을 단순화하기 위해). 필자는 항상 8 바이트의 배수로 채우는 머리글을 사용하며 문제가 없었습니다. 하지만 4 바이트는 모른다. – Patrick

답변

3

32 비트 창에서 하드웨어가 정렬되지 않은 데이터 액세스를 처리 할 수 ​​있기 때문에 속도가 느려질 수 있습니다. 다른 운영 체제/플랫폼

는 (OS가 정렬되지 않은 메모리 액세스를 잡는다 어떤 경우에는 당신을 위해 그것을 시뮬레이션 또는 매우 느린 성능) 가능성이

관련 문제