programing

'얼라인먼트 포인터'란 정확히 무엇입니까?

itsource 2022. 8. 17. 21:43
반응형

'얼라인먼트 포인터'란 정확히 무엇입니까?

정렬된 포인터가 무슨 뜻인지 누가 좀 말해줄래요?

이는 가리키는 주소가 어떤 요인에 의해 균등하게 분할된다는 것을 의미합니다.

"자연 정렬"이라는 용어가 사용되는 경우가 있습니다. 이는 일반적으로 자연스러운 정렬을 가진 개체를 개체의 크기에 따라 균등하게 나눌 수 있는 주소에 배치해야 함을 의미합니다.

정렬은 하드웨어와 관련된 많은 것들이 이러한 정렬에 제한을 두기 때문에 매우 중요합니다.

예를 들어 기존 SPARC 아키텍처(및 기존 ARM)에서는 홀수 주소에서1바이트보다 큰 정수를 읽을 수 없습니다.이렇게 하면 프로그램이 즉시 중지되고 버스 오류가 발생합니다.x86 아키텍처에서는 CPU 하드웨어가 대신 (필요에 따라 캐시 및/또는 메모리에 여러 번 액세스하여) 문제를 처리합니다.단, 시간이 더 걸릴 수 있습니다.RISC:Ier 아키텍처는 일반적으로 이 기능을 제공하지 않습니다.

이와 같은 것들은 패딩에 영향을 미칠 수 있다. 즉, 정렬을 유지하기 위해 구조 필드 사이에 더미 데이터를 삽입하는 것이다.다음과 같은 구조:

struct example
{
  char initial;
  double coolness;
};

에, 「7바이트」는 「7바이트」로 할 수 있습니다.double자신의 크기로 나누어지는 오프셋에 필드를 정렬합니다(이 값은 8이라고 가정합니다).

2진수로 표시할 경우 n바이트로 정렬된 주소의 log2(n) 최하위 비트는 0으로 설정됩니다.예를 들어 log2(32)는 5이므로 32바이트 정렬이 필요한 객체는 (2진수) 00000으로 끝나는 올바르게 정렬된 주소를 가집니다.이는 필요한 비트 수를 클리어함으로써 주소를 강제로 정렬할 수도 있음을 의미합니다.

unwind의 설명에 덧붙이자면, 다음과 같은 것이 있습니다.struct최근 과제에서 사용한 적이 있습니다.

struct infosale {               
    int   noseq;                
    char  salesman[30];         
    char  product[11];          
    int   count;                
};                               

크기는 할 수 .struct) (4+30+11+4=)49 실제로는 " "Bytes"입니다.52sizeof왜냐면noseq4+ "byte" +salesman32얼라인먼트) + "Bytes"(얼라인먼트) + "Bytes"(얼라인먼트)product12및 "bytes(aligned)"count4즉 '''가 됩니다.52

콘텍스트에 따라 다르지만 포인터 자체가 정렬되어 있거나 포인터가 가리키는 것이 정렬되어 있을 수 있습니다.

'Aligned'는 특정 객체가 특정 상수의 배수인 주소에 저장되는 것을 의미합니다.예를 들어 32비트 정수의 경우 이는 거의 항상 4입니다.이는 바이트가 8비트이기 때문입니다: 4*8 = 32비트.대부분의 경우 오브젝트가 정렬된 주소에 저장되어 있는 경우 프로세서는 훨씬 더 빠른 메모리 액세스를 수행할 수 있습니다.또한 일부 프로세서의 경우 정렬되지 않은 액세스를 수행할 수도 없습니다.

이것은 "aligned" 주소에 대한 포인터입니다.주소가 값의 배수라는 의미에서 정렬됩니다.일반적으로 주소가 가리키는 유형의 크기(기본 유형인 경우) 또는 이러한 정렬을 필요로 하는 데이터 멤버의 크기입니다.

통상, 이것에 대해서는 걱정할 필요가 없습니다.메모리 할당 기능은, 메모리 할당이 제공하는 메모리가 올바르게 정렬되도록 합니다.포인터 캐스트를 사용하여 안전하지 않은 작업을 시작하는 시점부터 정렬에 대해 걱정하기 시작합니다.

이전에 언급한 바와 같이 포인터는 일정한 바이트 수로 균등하게 나눌 수 있습니다.

포인터가 정렬되었는지 확인하려면 다음을 수행합니다.

isaligned = !( (long)pointer % bytes );

여기서 "inter"가 "bytes" 바이트에 정렬되면 "isaligned"가 참입니다.

Aligned Pointer는 인접한 메모리 위치를 가진 포인터가 상수와 그 배수를 더하면 접근할 수 있음을 의미합니다.

위해서char a[5] = "12345";

여기서a다음 chracter에 액세스할 수 있을 때마다 char의 크기가 일정한 포인터입니다.

a+sizeofchar가 액세스합니다.2

a+( size ofchar * 2 )가 액세스 합니다.3기타 등등

마찬가지로 비트 값으로 가변 비트에 액세스하는 경우에도 마찬가지입니다.

언급URL : https://stackoverflow.com/questions/4322926/what-exactly-is-an-aligned-pointer

반응형