programing

(T)의 크기 == (정조 T)의 크기 및 (T)의 정렬 == (정조 T)의 정렬 여부

javajsp 2023. 9. 16. 08:40

(T)의 크기 == (정조 T)의 크기 및 (T)의 정렬 == (정조 T)의 정렬 여부

다음과 같이 추정하는 것이 타당해 보입니다.T그리고.const T크기가 같고 정렬이 같은 두 가지 유형일 것입니다. 하지만 실제 시스템에 대해 생각해 본 결과, 이들은 다를 수 있을 것으로 보입니다.

제가 설명해 드리겠습니다.

RAM과 Flash(읽기 전용) 두 가지 유형의 메모리가 있는 시스템이 있다고 가정합니다.RAM은 8비트 어드레싱이 가능한 반면 플래시는 16비트 어드레싱만 가능합니다.이것이T:

struct T
{
  uint8_t x;
  uint16_t y;
};

바이트 어드레싱 가능 RAM에서는 이 구조가 3바이트 길이일 것입니다. 하지만 더블 바이트 어드레싱 가능 플래시에서는 (여기서 a는const변수가 상주합니다) 이 구조물은 정렬 문제 때문에 최소 4바이트 이상이어야 합니다.

그래서 제 질문은 다음과 같습니다.

c 및 c++ 표준이 크기 및 정렬을 보장합니까?const그 외의const유형?

섹션 3.9.3:

형식의 cv-qualified 또는 cv-unqualified 버전은 별개의 형식이지만 동일한 표현 및 정렬 요구사항을 가져야 합니다(3.11). 53

여기서 "cv-qualified"는 다음을 나타냅니다.const그리고.volatile. 대답은 그렇다 입니다.

const그리고.volatile지정한 개체에 대한 액세스 제한/속성만 지정합니다.기본 유형 자체의 일부로 간주되지 않으므로 유형의 속성에 영향을 줄 수 없습니다.

예, 이는 [basic.type.qualifier] / 1에 의해 보장됩니다.

형식의 cv-적격 또는 cv-비적격 버전은 별개의 형식이지만 동일한 표현정렬 요건을 가져야 합니다(3.11).

바이트 주소 지정 RAM에서는 이 구조가 3바이트 길이입니다. 하지만 이중 바이트 주소 지정 플래시(정규 변수가 있는 위치)에서는 정렬 문제 때문에 이 구조가 최소 4바이트 길이여야 합니다.

그러나 컴파일러는 그것이 단지 그것이라고 추론할 수는 없습니다.const여기, ROM에 저장됩니다.이런 걸 막을 수 있는 게 많아요mutable, 아니면 당신은 단지 역동적으로 위치시킬 수 있습니다.const T스택에 저장하거나 RAM 또는 천 개의 다른 것들의 힙 메모리에 수동으로 저장합니다.당신은 또한 당신이를 가질 수 있습니다.const T&어느 위치에 있을 수도 있습니다

언급URL : https://stackoverflow.com/questions/38799924/does-sizeoft-sizeofconst-t-and-alignoft-alignofconst-t