2017-12-01 1 views

답변

6

들은 서로 ([class.mem]/13)에 대해 증가하는 어드레스가 보장되어 동일한 액세스 제어 (조 [클래스 A (비 연합)의

비 정적 데이터 멤버 클래스 . 액세스])는 나중에 개체 이 클래스 개체 내에서 더 높은 주소를 갖도록 할당됩니다.

굵게 표시된 텍스트에 유의하십시오. field2이 모두 field1 이후에있을 때 보장되지만, 다른 액세스 제어가있는 경우에는 그렇지 않아도됩니다. 물론 중간 패딩은 항상 옵션입니다. 당신은 패딩의 부재를 강제 할, 그들은 동일한 유형의 경우

그러나, 배열은 그것을 할 것입니다 :

uint64_t field[2]; 

을 또한 잘 정의 &field[0] + 1을 만들고, 이러한 개체는 이제 분명히 멤버이기 때문에 동일한 배열의

+0

수작업으로 정렬 할 수 있습니까? – Incomputable

+0

감사합니다. 질문의 upd를보십시오 :) – vladon

+0

@Incomputable - 아마도. 그것은 제가 말하고자하는만큼 확실합니다. 모든 것이 * 매우 * 구현으로 정의됩니다. – StoryTeller

4

예 주문이 보장됩니다.

field1의 주소는 my_class_t의 인스턴스의 주소와 같아야합니다. field2field1보다 높은 주소를 가지므로 field1 주소의 reinterpret_cast에서 얻은 unsigned char* 포인터의 양수 포인터 산술은 결국 field2이 차지하는 메모리에 도달합니다.

그러나이 field1에 대한 포인터에 포인터 연산에 의해 field2을 "도달"시도의 행동이 정의입니다 있습니다.

멤버 사이에 패딩이 없는지 확인하려면 휴대용 C++에서이를 수행 할 수 없습니다.

class my_class_t { 
private: 
    uint64_t fields[2]; 
}; 

것을 보장 할 것이다 :하지만 당신은 배열 형식을 사용할 수 있습니다. 그리고 나서 은 포인터 연산을 사용하여 멤버에게 도달 할 수 있습니다.

0

메모리에있는 객체의 순서는 액세스 한정자가 개입하지 않을 때의 선언 순서와 같습니다.

관련 문제