2017-01-14 2 views
1

변수 v의 크기는 12 바이트이지만 크기는 6 비트이므로 왜 4 바이트가되지 않습니까?총 프로그램 크기가 6 비트인데 반해 다음 프로그램의 출력이 12 바이트로 나오는 이유는 무엇입니까?

#include <iostream> 
using namespace std; 

struct abc { 
    int c : 4; 
    char x : 1; 
    int y : 1; 
} v; 

int main() 
{ 
    cout << sizeof v; // it prints 12 . why? 
} 
+0

모든 것이 올바르게 메모리에 정렬되도록하려면 struct에 메모리가 채워져 있어야합니다. 컴파일러가 4 바이트 경계에서 스트라이드를 설정하는 것처럼 보입니다. 각각 4 바이트를 차지하는 int가 2 개 있습니다 (int32이지만 명시 적으로 정의되어 있지 않습니다. 컴파일러가이를 해결합니다). 마지막으로 char는 1 바이트를 차지하여 9 바이트로 나타납니다. 메모리는 홀수로 해결할 수 없습니다. 각 주소는 짝수 간격으로 시작해야하므로 3 바이트로 채워 지므로 4 + 4 + 4 = 12 – Alex

+0

으로 볼 수 있습니다. http://en.cppreference.com/w/ cpp/language/bit_field –

답변

5

문제는 비트 필드 유형을 혼합하는 것입니다. 그 수있는 패딩을 추가하여 데이터가 정렬되어 있는지 확인하십시오. int을 사용하면 회원간에 패딩이 필요하지 않습니다. 이 사용중인하는 컴파일러에 많이 의존

참고. 가정용 리눅스 시스템에서 GCC 6.2.0을 사용해 본다면 유형에 관계없이 크기가 4 바이트가됩니다.

+0

또한 Apple LLVM 버전 8.0.0을 사용하여'OSX '에'4'를 출력합니다. – axiac

+0

예 ISO C에서 가져온 것입니다. 1409 구현시 비트 필드를 저장할만큼 큰 주소 지정 가능한 저장 장치를 할당 할 수 있습니다 . 따라서 패딩이있을 수도 있고 없을 수도 있습니다. – void