2011-11-08 2 views
20

간단한 구조체에서 sizeof()를 사용할 수없는 이유는 무엇입니까?sizeof() 구조를 알 수 없습니다. 왜?

예 :

private struct FloatShortPair 
{ 
    public float myFloat; 
    public short myShort; 
}; 

int size = sizeof(FloatShortPair); //CS0233 

오류 CS0233 : 'FloatShortPair'는 미리 정의 된 크기를 가지고 있지 않습니다 따라서는 sizeof는 안전하지 않은 상황에서 사용할 수있다 (System.Runtime.InteropServices.Marshal.SizeOf 사용을 고려)

MSDN 상태 :

sizeof의 운영자은 컴파일 시간있습니다 유형에 사용할 수 있습니다

상수. 이 오류가 발생하면 의 크기를 컴파일 타임에 확인할 수 있는지 확인하십시오. 그럴 수 없다면, 은 sizeof 대신 SizeOf를 사용합니다.

float 및 short는 컴파일시 정수가 아닌데 어떻게됩니까? shortfloat의 8/

답변

23

크기는 일정 -하지만 CLR 메모리 에 그 플로트를 포장하기로 결정 방법을 반드시 일정한 없습니다. 예를 들어, 64 비트 프로세서에서 각 값을 8 바이트 경계에 정렬하도록 결정할 수 있습니다. 는 C# 4에서 사양

섹션 18.5.8 : 아래 표에 나타낸 바와 같이 미리 정의 된 특정 유형의

sizeof 연산자는 정수 값을 산출한다.

는 [...] 다른 모든 형태

sizeof 연산자의 결과는 구현 정의되고 아닌 값 상수로 분류된다. 얼라인먼트 목적

[...]

는이 구조체 내의 구조체의 시작 이름 패딩 수 있으며, 구조체의 끝에있다. 당신이 unsafe 맥락에서,이 상황에서 sizeof을 사용할 수 있습니다

참고. 당신이 그것을 사용해야하는지 또는 Marshal.SizeOf이 당신이 무엇을하려고하는지에 달려 있습니다.

+1

오류 메시지에서 알 수 있듯이 System.Runtime.InteropServices.Marshal.SizeOf를 사용하십시오. –

+1

관련 질문 (하이재킹) : 형식의 레이아웃 (명시 적 오프셋이있는 StructLayoutAttribute)을보다 세밀하게 제어하면 컴파일 시갂 상수가됩니까? – MattDavey

+1

@MattDavey : 사양에 맞지 않습니다. 기본적으로 C# 언어 사양은 StructLayoutAttribute와 같은 구현 세부 정보를 얻지 않으려 고합니다. –