2014-07-23 5 views
2

구조체 채우기 및 바이트 정렬 개념을 어느 정도 이해했습니다. 는하지만 일부 설명이 필요한 구조는 다음과 같이 선언 question.Say 아래의 2 바이트 char c 4의 끝 부분에 패딩 얻을로구조체 패딩 및 요소 액세스

struct somejunk 
{ 

    int a; 
    char b; 
    char c; 
    int d; 
    double e; 
} 

내 생각은, 구조가 전체 24 바이트의 크기를 얻을 수있다 int d 끝에 채워진 바이트 내 질문은 어떻게 CPU가 개별 요소를 가져 오는가? 가져 오는 방법은 요소 char b을 말하는가? 구조체의 처음 8 바이트를 읽고 구문 분석합니까?

답변

3

세부 사항은 물론 특정 하드웨어에 따라 다릅니다. 그러나 준수하는 C11 구현은 각 구조체 멤버가 데이터 경합의 목적을위한 별도의 메모리 위치임을 보장해야합니다. 즉, 주어진 객체가 somejunk junk 인 경우 두 개의 개별 스레드가 동기화를 요구하지 않고 junk.bjunk.c을 올바르게 수정할 수 있어야합니다. 따라서 char의 크기는 하드웨어가 다른 메모리 위치에 쓰기를 고안하지 않고 이러한 액세스를 수행 할 수 있어야합니다.

예를 들어, 86의 경우는 mov BYTE PTR [eax], 51*eax의 바이트의 값을 설정하고, 다른 메모리와 상호 작용해야이없이 eax의 값에, 다른 어드레스에 액세스하여 말할 수있다. CPU의 캐시 일관성 프로토콜은 다른 CPU의 캐시를 알려주는 방법과 캐시가 적절하게 더러워 지도록 eax을 포함하는 캐시 라인을 수정하는 방법을 파악해야합니다.