유형 또는 변수가 있는 크기
최근 누군가가 (유형)의 크기가 아닌 var의 크기를 사용하는 것을 다른 사용자에게 추천하는 것을 보았습니다.저는 항상 그것이 단지 스타일의 선택이라고 생각했습니다.중요한 차이가 있습니까?예를 들어, f와 ff가 있는 선이 g와 gg가 있는 선보다 더 나은 것으로 간주되었습니다.
typedef struct _foo {} foo;
foo *f = malloc(count * sizeof f);
foo *g = malloc(sizeof(foo) * count);
foo **ff = malloc(count * sizeof *ff);
foo **gg = malloc(sizeof(foo*) * count);
제 생각에는 첫 번째 세트는 스타일의 문제일 뿐입니다.그러나 두 번째 줄 쌍에서 여분의 초 *는 쉽게 곱셈으로 혼동될 수 있습니다.
변수의 유형이 변경되면 유형이 아니라 변수가 인수인 경우 의 크기를 변경할 필요가 없습니다.
@icepack 님의 코멘트와 관련하여: 유형 대 변수명의 변경 가능성 또는 가능성은 문제가 되지 않습니다.변수 이름이 크기에 대한 인수로 사용되었다가 나중에 변경되었다고 상상해 보십시오.최상의 경우 리팩터 이름 변경 작업은 모든 발생을 변경하며 오류는 발생하지 않습니다.최악의 경우 크기의 인스턴스를 놓쳐서 컴파일러가 불평을 하면 수정합니다.유형이 변경되면 문 크기에 오류가 발생할 가능성이 없습니다.
이제 유형이 크기에 대한 논쟁이라고 상상해 보세요.변수의 유형이 변경된 경우 해당 변수와 관련된 모든 크기를 찾는 것은 검사 외에 다른 방법이 없습니다.검색은 가능하지만, 동일한 유형의 크기와 무관한 모든 사용에 대해 히트가 발생합니다.하나를 놓치면 크기 불일치로 인해 런타임 문제가 발생하므로 찾기가 훨씬 더 어렵습니다.
Steve가 말한 것과 더불어 의 크기는 피연산자를 평가하지 않는다는 것을 덧붙이겠습니다.그래서 당신은 그 안에서 무엇이든 자유롭게 할 수 있습니다.아직 초기화되지 않은 변수를 사용할 수 있을 뿐만 아니라 null-point, 호출 함수의 참조를 해제하고 선언된 함수만 수행할 수 있습니다.스티브가 크게 설명한 이유로 항상 표현 버전을 사용하기를 권합니다.
또한 때때로 유형 이름이 정말 길고 읽을 수 없다는 것을 고려하십시오. 함수에 대한 포인터(특히 C++)를 생각해 보십시오.을 쓰는 에.sizeof(my_long_type<weird, stuff>)
당신은 그냥 합니다.sizeof t
.
이들 사이에 별 차이가 없을 수도 있습니다.
foo **ff = malloc(count * sizeof *ff);
foo **gg = malloc(sizeof(foo*) * count);
..그러나 그 할당이 선언문에 근접하지 않으면 어떻게 됩니까?만약 내가 다음과 같은 말을 마주친다면:
ff = realloc(ff, count * sizeof *ff);
의 종류인 이 정확하다고 할 수 있습니다.ff
이걸 그러나 이 내용을 보면 다음과 같습니다.
ff = realloc(ff, count * sizeof(foo *));
좀 요의 할 것 같습니다. 그리고 어떤 유형인지 찾아봐야 할 것 같아요.ff
내 마음을 안정시키기 위해서 입니다.
더 나쁩니다. f f g 는 gg .sizeof f
f는 점이므로 포인터 크기입니다.그들을 동등하게 만들기 위해서는, 당신은 글을 써야 할 것입니다.sizeof *f
위해) 해,sizeof(*f)
).
제가 쓰는 편입니다.sizeof(type)
하지만 항상상,는.sizeof(variable)
로컬 또는 전역 변수를 사용하는 경우.그럼에도 불구하고 항상 변수 이름을 사용하라는 조언에는 지혜가 있습니다.
를 ( 다소 긴 (, 했습니다)sizeof(variable)
아니면 꼭 그래야 하는 것인지는sizeof variable
, 로 감싸는지 가 중요합니까?sizeof
는 에 본 이 없습니다.sizeof(variable)
저는 를 합니다와 합니다.sizeof
제 는 안 된다고 과 없는 표기법 제 동료는 괄호를 변수와 함께 사용해서는 안 된다고 단호하게 말했습니다. 괄호가 있는 표기법과 없는 표기법 사이에 가치 있는 차이가 있다는 것입니다.나는 설득당하지 않았습니다 - 나는 설득당하기를 기대하지 않습니다.
으로에 관한 몇 는 완전히 으로에 관한 몇 가지 이 있습니다.sizeof
:
- 및- 가변 - VLA - 를 사용하는 경우
sizeof(vla)
컴파일 시간 상수가 아닙니다.조심하세요! - 가 C 를 .
sizeof
성가신 일이지만 논리적인 일입니다.
변수의 크기를 취하는 것은 예상치 못한 결과를 초래할 수 있습니다.변수가 배열인 경우, (array)의 크기는 개별 요소의 크기나 포인터의 크기가 아니라 배열의 크기를 반환합니다.포인터의 크기를 가져오면 포인터의 크기가 반환됩니다.하지만 배열은 보통 전달될 때 포인터로 표현되기 때문에, 상황이 혼란스러워질 수 있습니다.
비즈니스 논리가 당신의 선택을 정의합니다.
이 가 없으면 합니다를
sizeof(var)
특정 유형의 변수 집합을 코드화하는 경우 - 선택
sizeof(type)
. 보통 이것이 필요합니다.typedef
이는 유형(예: 직렬화)에 따라 다르게 처리하는 많은 변수를 정의합니다.이러한 변수 중 어떤 것이 향후 코드 버전에 남아있을지 모를 수 있으므로 인수로 유형을 선택하는 것이 논리적으로 정확합니다.그와 같은 변화조차도typedef
당신에게 영향을 주지 않을 것입니다.sizeof
.선
언급URL : https://stackoverflow.com/questions/373252/sizeof-with-a-type-or-variable
'programing' 카테고리의 다른 글
스크롤을 비활성화한 웹사이트에서 스크롤을 보편적으로 활성화하는 방법은? (0) | 2023.09.24 |
---|---|
선택 쿼리 MySQL, Bego에서 특정 ID의 합을 선택하는 방법 (0) | 2023.09.24 |
MySQL: 유닉스 타임스탬프 또는 DATTIME 중 가장 사용하기 좋은 것은 무엇입니까? (0) | 2023.09.24 |
PowerShell ISE에서 스크립트가 실행되고 있는지 확인할 수 있는 방법이 있습니까? (0) | 2023.09.24 |
커스텀 앱 오픈 URL 스킴을 Xcode 4에 등록하는 방법? (0) | 2023.09.24 |