calloc
의 대부분의 구현은 크기를 정렬로 취급하고 다음 지원되는 입상까지 반올림 해 주는지 궁금합니다.내가 calloc (1000, 23)이라고 말하면, 23이 "round up"을 24로합니까? 아니면 32?
그렇다면 다음 2의 제곱으로 올림하거나 8 또는 16의 다음 배수로 반올림합니까?
calloc
이 매개 변수를 동일하게 유지하면 어떻게 작동합니까? 데이터가 정렬되지 않았습니까?
감사합니다.
calloc
의 대부분의 구현은 크기를 정렬로 취급하고 다음 지원되는 입상까지 반올림 해 주는지 궁금합니다.내가 calloc (1000, 23)이라고 말하면, 23이 "round up"을 24로합니까? 아니면 32?
그렇다면 다음 2의 제곱으로 올림하거나 8 또는 16의 다음 배수로 반올림합니까?
calloc
이 매개 변수를 동일하게 유지하면 어떻게 작동합니까? 데이터가 정렬되지 않았습니까?
감사합니다.
sizeof
은 배열 내의 객체 크기를 산출하기 위해 정의됩니다. 즉, 적절한 정렬을 위해 필요한 모든 패딩을 이미 고려하고 있습니다. 따라서 이 어떤 객체 인 경우 foo
의 경우 23이면 프로세서가 바이트 정렬되어야합니다. (다른 한편으로는, 당신이 그것을 전달하는 것이 좋은 가치라고 생각하기 때문에 당신이 23을 통과한다면, 당신에게 행운을 빕니다. 당신은 당신 자신에 달려 있습니다.)
정렬에 관한 한, calloc(1000, 23)
malloc(1000 * 23)
과 정확하게 같습니다. 구현이 어떤 식 으로든 크기를 "정렬"하기로 결정하면 23000
의 총 크기를 구현 정의 값보다 더 크게 설정합니다. calloc
의 두 번째 매개 변수 (또는 첫 번째 매개 변수)에는 특별한 대우가 적용되지 않습니다.
calloc(1000, 23)
에 24
에 23
을 스냅 정말 (전체 크기의 측면에서) 23000
24000
에 끼워 의미 할 것입니다. 정렬 목적으로 전체 1000
을 추가해야하는 합리적인 실제 구현은 없습니다.
하하 그래, 나는 운이 좋다. :) 그렇다면 정렬 된 값을 두 번째 매개 변수로 전달하는 것은 프로그래머의 책임입니다. 홀수 인 경우 런타임의 동작에 대한 공식 사양은 없지만 processsor에는 4 바이트 정렬이 필요합니까? – Mehrdad
적절히'sizeof'를 사용하지 않고 이처럼 바이트를 가지고 놀고 있다면 컴파일러가 어떻게 구조체로 오프셋을 계산하는지 다시 생각해 보려고합니까? 하지만 그건 제외하고 23이 너무 큰 경우 유일한 문제는 공간을 낭비한다는 것입니다. 너무 작 으면 자신 만의 것이 아닙니다. 당신은 실패 할 운명입니다. –
@ Dan : 지금 C 표준의'sizeof' 연산자 6.5.3.4 절을 읽고 있지만'sizeof' 계산에서 정렬 배려에 대한 언급을 보지 못했습니다. 'sizeof'가 정렬을 설명하는 곳은 어디입니까? –