sizeof가 컴파일 타임 연산자라고하는 이유는 무엇입니까?


12

원래 이것은 다른 질문 의 일부입니다 .

sizeof컴파일 타임 연산자라고하는 이유는 무엇 입니까? 그것을하지 않습니다 실제로 런타임 연산자? 그리고 실제로 컴파일 타임 연산자라면 다른 컴퓨터에서 동일하게 실행되는 휴대용 코드를 만드는 데 어떻게 도움이됩니까? 자세하게 설명하십시오.



3
런타임에 유형의 크기가 어떻게 변할 것으로 예상합니까?

@MichaelT : 유형 의 인스턴스 크기 는 확실히 변할 수 있습니다. 결국 클래스 다형성이 있습니다. 나는 sizeof(polymorphic_ptr*)일정하다는 것은 매우 직관적이지 않으며 어리석은 일 이라고 주장합니다 . 그래, C ++ 방식이지만 어리석은 일이다.
Monica Monica 복원

@KubaOber 실제로. OP가 다른 경우에 어떻게 행동해야한다고 생각했는지 궁금하고 궁금한 점이 있으면 질문을 확장하는 데 도움이되는 혼동을 보여주는 코드를 얻을 수 있기를 바랍니다.

4
"컴파일 시간에 작동하기 때문에"라는 대답을지지하기 위해왔다.
벤 잭슨

답변:


23

sizeof()메모리에서 해당 유형의 특정 인스턴스 크기가 아닌 데이터 유형 의 크기를 제공합니다 .

예를 들어, 런타임시 가변 크기 문자 배열을 할당 한 문자열 데이터 객체가있는 경우 sizeof()해당 문자 배열의 크기를 결정하는 데 사용할 수 없습니다. 포인터의 크기 만 제공합니다.

데이터 유형의 크기는 항상 컴파일 타임에 알려져 있습니다.


3
C (++)에는 런타임 객체 메타 데이터가 없기 때문에 실제로 런타임에 이러한 것을 얻을 수는 없습니다.
C. Ross

5
실제로 sizeof배열에서 사용 하는 경우 배열 의 크기 (요소 크기와 요소 수의 곱) 얻게 됩니다 . 그러나 포인터로 사용하면 포인터 크기 만 가져옵니다. 따라서 배열의 크기를 알고 싶은 대부분의 경우 포인터 만 있으면 유용하지 않습니다.
sepp2k

1
@Jens 질문에 [C ++] 태그가 지정되었으며 VLA가 C ++ 표준으로 만들지 않았습니다.
authchir

13

"call"의 전체 크기는 컴파일 타임에 계산되고 괄호 사이에있는 것은 버려지고 런타임에 실행 되지 않기 때문에 ,

결과는 순전히 컴파일러가 사용할 수있는 정적 유형 정보를 기반으로합니다.


7

sizeof가 컴파일 타임 연산자라고하는 이유는 무엇입니까?

컴파일시 컴파일러는 표현식의 크기를 계산하고 해당 컴파일 타임 상수 값을 대체합니다.

실제로 런타임 연산자 아닌가요?

sizeof컴파일러가 식 의 유형 이 무엇인지 알아낼 수있는 한 합법적으로 실행할 수없는 식의 크기 (예 : 정의되지 않은 동작이 발생할 수 있음)를 평가하는 데 사용할 수도 있습니다 .

또한 C ++ 11 이전에도 런타임 식을 사용할 수없는 방식으로 식을 constexpr사용할 수 있습니다 sizeof.

그리고 실제로 컴파일 타임 연산자 인 경우 휴대용 코드 생성에 어떻게 도움이됩니까?

플랫폼마다 유형이 다를 수 있습니다. sizeof하드 코딩 된 가정 대신 표현식을 사용하면 다른 플랫폼에서 컴파일 할 때 코드가 중단되지 않고 유형이 변경 될 수 있습니다.


1
글쎄, 나는 이것이 가장 유용한 대답이라고 생각한다.). 브로 (당신이 남성이라고 가정), 의심합니다. 사람들이 sizeof가 프로그램을 이식 가능하게 만든다고 말하면 소스 코드 가 모든 컴퓨터에서 오류없이 컴파일 될 수 있으며 실행 프로그램 이 모든 컴퓨터에서 실행될 수 있음을 의미하지는 않습니다 . 권리 ? 이것이 옳다면, 의심은 정말로 사라집니다.
평화로운 코더

1
예, 코드 는 이식성이 뛰어나므로 각 플랫폼마다 (다른) 올바른 바이너리를 컴파일 할 수 있습니다.
쓸모없는

5

C ++은 실제로 런타임에 객체의 메타 데이터를 저장하지 않으므로 크기 확인은 컴파일 시간이어야합니다. C ++가 크기를 확인하지 않는 방법에 대한 예제는 int임의 크기 의 배열을 선언 하고 끝을지나 읽습니다. 운이 좋으면 segfaultC ++이 배열의 크기를 추적하지 않기 때문에 횡설수설을 읽을 가능성이 높습니다.

참조 배열 (UNIX)의 끝을지나 읽기에서 할 수있는 C / C ++ 프로그램 독방 감금 - 잘못? SO에서 예를 들어.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.