2016-11-24 2 views
1

완전히 정적 인 클래스의 주소를 가져 가면 멤버가 올바른 순서로 정렬된다는 보장이 있습니까? 글로벌 범위에서 정의 된 변수 그룹에 대해서도 마찬가지입니다.주소를 가져 가면 정적 변수의 순서가 보장됩니까?

struct Buffer1 
{ 
    static float val1; 
    static float val2; 
}; 

void readBuffer(void* buffer){ /*Do something*/} 

int main() 
{ 
// Sending the buffer 
    readBuffer(&Buffer1);    // Type name is not allowed 
    readBuffer(&Buffer1::val1);   // Does work, wondering if data will be correct 

    return 0; 
} 

또한 static 또는 global 변수 그룹의 크기를 취하는 방법이 있습니까? Like :

// Getting the size of the buffer 
    size_t sizeOfBuffer = sizeof(Buffer1); // Wrong size, doesn't measure static members 
    sizeOfBuffer = sizeof(Buffer1::val1) + sizeof(Buffer1::val2); // Does work but doesn't account for data padding/alignment, and is also tedious to change 

이 경우에는 클래스를 인스턴스화하는 것이 훨씬 더 효과적이지만이 두 가지 질문에 대해 궁금합니다. 감사.

+2

변수를 구조체에 넣기 만하면됩니다. –

+1

구조체 패딩 문제에 대해서도 실행됩니다. 당신은 할 수 없어'struct Buffer1 {float val1, val2; }; static Buffer1 buffer1;'대신'sizeof' 문제를 피할 수 있습니다. –

+0

@Ken Y-N 네, 물론, 그것이 현재 가지고있는 방법입니다. 저는 궁금해서 언어의 기능에 대해 배우고 static 구조체로 무엇을 할 수 있는지 알아 내려고했습니다. – Zebrafish

답변

2

아니요, C++ 표준은 정적 범위에서 메모리에있는 개체의 순서를 지정하지 않습니다.

C++ 표준도 클래스 멤버의 상대적인 순서를 보장하지 않습니다.

+0

C++ 11은 동일한 액세스 제어 내의 비 정적 클래스 데이터 멤버가 메모리에서 순차적으로 정렬되도록 보장합니다. – doug

+0

@doug 흥미 롭습니다. 죄송 합니다만, "동일한 액세스 제어"에 익숙하지 않습니다. 같은 지역에서 의미가 있습니까? 그래서 연속적으로 또는 세계 공간에서 연속적으로 열거 되었습니까? – Zebrafish

+1

@TitoneMaurice : private, public, protected로 구분 된 선언 된 변수는 표준에 의해 연속적 일 필요는 없습니다. 변수는 패딩과 함께 가능하지만 이러한 액세스 지정자 사이에서 연속적으로 정렬됩니다. – doug

관련 문제