2011-01-04 7 views
3

calloc의 대부분의 구현은 크기를 정렬로 취급하고 다음 지원되는 입상까지 반올림 해 주는지 궁금합니다.내가 calloc (1000, 23)이라고 말하면, 23이 "round up"을 24로합니까? 아니면 32?

그렇다면 다음 2의 제곱으로 올림하거나 8 또는 16의 다음 배수로 반올림합니까?

calloc이 매개 변수를 동일하게 유지하면 어떻게 작동합니까? 데이터가 정렬되지 않았습니까?

감사합니다.

답변

5

sizeof은 배열 내의 객체 크기를 산출하기 위해 정의됩니다. 즉, 적절한 정렬을 위해 필요한 모든 패딩을 이미 고려하고 있습니다. 따라서 이 어떤 객체 인 경우 foo의 경우 23이면 프로세서가 바이트 정렬되어야합니다. (다른 한편으로는, 당신이 그것을 전달하는 것이 좋은 가치라고 생각하기 때문에 당신이 23을 통과한다면, 당신에게 행운을 빕니다. 당신은 당신 자신에 달려 있습니다.)

+0

하하 그래, 나는 운이 좋다. :) 그렇다면 정렬 된 값을 두 번째 매개 변수로 전달하는 것은 프로그래머의 책임입니다. 홀수 인 경우 런타임의 동작에 대한 공식 사양은 없지만 processsor에는 4 바이트 정렬이 필요합니까? – Mehrdad

+1

적절히'sizeof'를 사용하지 않고 이처럼 바이트를 가지고 놀고 있다면 컴파일러가 어떻게 구조체로 오프셋을 계산하는지 다시 생각해 보려고합니까? 하지만 그건 제외하고 23이 너무 큰 경우 유일한 문제는 공간을 낭비한다는 것입니다. 너무 작 으면 자신 만의 것이 아닙니다. 당신은 실패 할 운명입니다. –

+0

@ Dan : 지금 C 표준의'sizeof' 연산자 6.5.3.4 절을 읽고 있지만'sizeof' 계산에서 정렬 배려에 대한 언급을 보지 못했습니다. 'sizeof'가 정렬을 설명하는 곳은 어디입니까? –

3

정렬에 관한 한, calloc(1000, 23)malloc(1000 * 23)과 정확하게 같습니다. 구현이 어떤 식 으로든 크기를 "정렬"하기로 결정하면 23000의 총 크기를 구현 정의 값보다 더 크게 설정합니다. calloc의 두 번째 매개 변수 (또는 첫 번째 매개 변수)에는 특별한 대우가 적용되지 않습니다.

calloc(1000, 23)2423을 스냅 정말 (전체 크기의 측면에서) 2300024000에 끼워 의미 할 것입니다. 정렬 목적으로 전체 1000을 추가해야하는 합리적인 실제 구현은 없습니다.

+0

'calloc'도 메모리를 초기화하기 때문에 정확하게 일치하지 않습니다. – dreamlax

+0

@dreamlax : 그래서 내가 정렬에 관한 한 ... "이라는 말로 시작한 것은 정렬 지향적 인 동작에 대해서만 말하고 있다는 것을 분명히하기 위해서입니다. – AnT

+0

나는 스킨을 읽어야한다. – dreamlax