2016-10-23 3 views
0

i가 아래와 같이 정의 된 구조를 가지고 있다고 가정 사용할 intger 변수는 4로 나눌 수있는 주소에서 시작해야하며 짧은 변수는 짝수 번째 주소에서 시작해야합니다. 이 경우에 우리는 문자 변수는 구조의 전체 크기가 12크기는

될 것입니다 여기에 0

struct 
{ 
    char a; // OFFSET 0+3 bytes padding 
    int b; // OFFSET 4 
    char c; //OFFSET 5+3 bytes padding 
}abc_t; 

오프셋에서 시작하지만 구조의 첫 번째 요소는 '인 경우 내 의심의 여지가 가정하면 char a '는 오프셋 1에서 시작하고 패딩 규칙에 따라 a 뒤에 2 바이트 만 패딩되므로 구조의 크기는 8 바이트가됩니다.

struct 
{ 
    char a;//OFFSET 1+2 bytes 
    int b;//OFFSET 4 
    char c;//OFFSET 8 
}abc_t; 

같은 변수는 짧은 변수로 시작하는 구조 변수의 경우입니다. 이 점에 대한 제 이해가 정확한지 또는 어떤 구조의 첫 번째 구성원이 항상 4로 나눌 수있는 주소에서 항상 시작한다고 가정 할 수 있습니까?

미리 감사드립니다. INT의

1) 크기가 필요한 4 바이트의를 sizeof (INT되지 않습니다) 컴파일러가 정의된다

+0

표시된 구조는 합리적으로 일반적인 협착/가정하에 4 바이트의 배수로 시작됩니다. 구조체에는 패딩을 가져올 수 없습니다. 다른 구조들은 다소 엄격하게 정렬 될 필요가 있습니다. 예를 들어,'struct ver1 {char a; 짧은 b; char c; }'는 크기가 6이고 짝수 경계에 정렬 될 수 있으며, struct ver2 {char a; 더블 d; char e; }'는 크기 24 일 수 있으며 8 바이트의 배수로 정렬 될 수 있습니다. –

+0

구조체의 첫 번째 멤버의 주소는 구조체의 주소와 항상 같아야한다는 규칙이 있습니다. 즉, 첫 번째 멤버 앞에 패딩이 없어야합니다. 즉, 첫 번째 멤버의 오프셋은 항상 있습니다. 0. –

+0

@SteveSummit : 확실히 : §6.7.2.1 ** 구조체 및 공용체 지정자 ** ¶15 _ ... 구조체 객체 내에는 패딩이 있지만 처음에는 패딩되지 않을 수 있습니다. _ ... ¶17 이름이 없음 구조체 또는 합집합의 끝에 패딩 ._ –

답변

-1

여기에 몇 가지 문제가 있습니다. 단어 길이에 따라 4 바이트, 8 바이트 또는 2 바이트가 될 수 있습니다. Is the size of C "int" 2 bytes or 4 bytes?을 참조하십시오.

2) 구조체의 필드 정렬은 컴파일러에 달려 있습니다. 필드를 넣은 순서가 더 엄격한 포장을 보장하지는 않습니다. 그러나 필드의 순서는 보존됩니다. Why isn't sizeof for a struct equal to the sum of sizeof of each member?을 참조하십시오.

3) 구조체를 더 짧게 만들면 일반적으로 더 엄격한 패킹이 발생합니다.

4) 구조체가 단어 경계에서 시작됩니다. 첫 번째 필드 앞에는 패딩이 없습니다. 그래서 예, 주소는 단어의 시작 부분에있을 것입니다. Why use address of first element of struct, rather than struct itself?.

희망이 도움이됩니다.